LoginSignup
6
7

More than 5 years have passed since last update.

# シェルスクリプトにおけるファイル記述子

Posted at


# シェルスクリプトにおけるファイル記述子

# 「『標準出力』、『標準エラー出力』を分けて、各ログファイルに出力する」
# と考えるのではなく、
# ・『標準出力(ファイル記述子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)







おわり
6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7