# シェルスクリプトにおけるファイル記述子
# 「『標準出力』、『標準エラー出力』を分けて、各ログファイルに出力する」
# と考えるのではなく、
# ・『標準出力(ファイル記述子1)』や『標準エラー出力(ファイル記述子2)』を、
# ファイルに置き換えたり (記述子>ファイル)
# ・あるファイル記述子Aを、ファイル記述子Bとおなじ出力に変更する (記述子A>&記述子B)
# と考えると、個人的には、わかりやすかった
# 前提として、標準出力と標準エラー出力は、画面上に出力される
# 標準出力(ファイル記述子1)を、sample.logに変更
"処理" 1>sample.log
# 上とおなじこと(1は省略できる)
"処理" >sample.log
# 標準エラー出力(ファイル記述子2)を、ERROR.logに変更
# (2は省略不可)
"処理" 2>ERROR.log
# 標準出力(ファイル記述子1)をsample.logに、
# 標準エラー出力(ファイル記述子2)をERROR.logに、変更
"処理" 1>sample.log 2>ERROR.log
# 標準出力(ファイル記述子1)を、sample.logに変更し、
# 標準エラー出力(ファイル記述子2)を、標準出力(ファイル記述子1)とおなじ出力にする
"処理" 1>sample.log 2>&1
# (解説)
# まず、標準出力(ファイル記述子1)を、sample.logに変更(1>sample.log)、
# 標準エラー出力(ファイル記述子2)を、標準出力(ファイル記述子1)とおなじ出力先に変更(2>&1)
# 標準出力(ファイル記述子1)はsample.logとなっているので、
# 標準エラー出力(ファイル記述子2)も、おなじsample.logになる
# 標準出力(ファイル記述子1)か標準エラー(ファイル記述子2)のどちらかで、
# sample.logが上書きされるため利用NG
# 例:
"処理" 1>sample.log 2>sample.log
# (ファイル記述子5)を、sample.logに変更、
# 標準出力(ファイル記述子1)と標準エラー出力(ファイル記述子2)を、
# (ファイル記述子5)とおなじ出力先にする(1>&5 2>&5)
# (ファイル記述子5)は、sample.log
"処理" 5>sample.log 1>&5 2>&5
# execコマンドによって、出力を保存しておくこともできる
# 現在の標準エラー出力(ファイル記述子2)を、ファイル記述子5に保存しておく
# 現在の標準エラー出力は、画面(プロンプト)
exec 2>&5
# 現在の標準エラー出力(ファイル記述子2)を、ファイルに置き換える
exec 2>sampleERR.txt
# →プロンプトに何も出力されなくなる。
# プロンプトへの基本的な出力は、標準エラー出力である・・・
# つまり、これは対話式の操作で利用できない
# シェル内でのログ出力設定に利用すれば、
# 処理のたびにログ出力先を書かなくて済む(めっちゃ便利!!)
# 例:
#!/bin/bash
# 処理1と処理2をします
# 標準出力をout.logに、標準エラー出力をerr.logに変更
exec 1>out.log
exec 2>err.log
"処理1"
"処理2"
# 例2:
# 標準出力をout.logに、標準エラー出力をerr.logに変更
# 画面にも出力
exec 1> >(tee -a out.log)
exec 2> >(tee -a err.log >&2)
おわり
More than 5 years have passed since last update.
Register as a new user and use Qiita more conveniently
- You get articles that match your needs
- You can efficiently read back useful information
- You can use dark theme
List of users who liked
67