コマンドの実行結果を保存したい場合、リダイレクト “>” を使えば実行結果をファイルに保存することが出来ます。しかしLinuxのプログラムの出力先は標準出力(1)と標準エラー出力(2)があります。この場合、標準出力の結果だけがファイルに保存されます。エラー結果を表示したい場合は、”2>”とします。
もし両方の結果をファイルに出力したい場合は、標準エラー出力の結果を標準出力に出力する 2>&1 という記述を最後につけます。
しかしこれでは、実行後ファイルを開かなければ出力結果を確認できません。
$ echo "test" > logfile.txt 1> の省略
$ ls -z >logfile.txt エラーの結果が logfile.txt に保存されない
ls: 無効なオプション -- 'z'
Try 'ls --help' for more information.
$ ls -z 2>logfile.txt エラーの結果が logfile.txt に保存されます。
$ command >logfile.txt 2>&1 標準出力とエラーの結果が logfile.txt に保存されます。
tee コマンドは、標準出力と同時にファイルにも出力してくれるコマンドです。
このように実行すると出力結果を確認しながらファイルにも保存されます。
$ command 2>&1 | tee logfile.txt
シェルスクリプト内で、出力先を制御したい場合は exec コマンドを利用します。Bash Start, End のみが出力されて、それ以外はファイルに保存されます。
$ command.sh
Bash Start
Bash End
$ cat logfile.txt
test
ls: 無効なオプション -- 'z'
Try 'ls --help' for more information.
command.sh
#!/bin/bash
echo "Bash Start"
exec 3>&1 <- ファイルディスクリプタ3番を標準出力に出力する。
exec > logfile.txt 2>&1
echo "test"
ls -z
exec >&3 <- ファイルディスクリプタ3を元に戻す
echo "Bash End"
ファイルディスクリプタ番号
0 標準入力
1 標準出力
2 標準エラー出力
n 以降 プログラムが開いているファイルが3,4,5 と順番に割り当てられる。
※ ファイルディスクリプタとは、プログラムがアクセスするファイルや標準入出力などをOSが識別するために用いる整数の識別子のことを言います。
※ exec は、コマンド内でシェルを実行するコマンドですが、シェルのリダイレクトの設定を変更することもできます。