標準出力と標準エラー出力を自在に集める
前提:例に使うコマンド
ls /home /nonexistent
標準出力と標準エラー出力の両方を出す短いコマンド
存在するディレクトリ(/home)と存在しないディレクトリ(/nonexistent)に対してlsする
ディレクトリが存在する場合:標準出力にディレクトリの中身が表示される
johndoe/ janedoe/ (/homeの中身)
ディレクトリが存在しない場合:標準エラー出力にエラーメッセージが表示される
"/nonexistent": No such file or directory (os error 2) (/nonexistentは存在しないのでエラー)
1. 標準出力だけ表示する
code:out_stdout
ls /home /nonexistent 2> /dev/null
2> /dev/null でエラーを捨てている
2. エラー出力だけ表示する
code:out_stderr
ls /home /nonexistent > /dev/null
> /dev/null で単に標準出力だけリダイレクトする
1> /dev/null でもいい
3. それぞれを別のファイルに書き込む
code:out_each
ls /home /nonexistent > output.log 2> error.log
> output.log 2> error.log で別々にリダイレクトを設定している
もちろん1> output.log 2> error.logでもいい
4. 両方を同じファイルに書き込む
code:out_both
ls /home /nonexistent > all.log 2>&1
2>&1 でエラー出力を標準出力へとリダイレクトしている
ls /home /nonexistent &> all.log でもいい
- 5. 両方を捨てる
code:throw_both
ls /home /nonexistent &> /dev/null
&>で両方の出力をリダイレクトしている
以下を覚えたら全部カバーできる
1. シェルにはデフォルトの出力先が2つ。stdout(標準出力)とstderr(標準エラー出力)
2. ところで、Unixでは全てがファイルである。リダイレクト先もリダイレクト元もファイルみたいに扱う
output.logとか:普通にファイルだよね
/dev/null :まあファイルシステム経由だよね
stdout, stderr :ファイルディスクリプタ指定経由のアクセスだね
3. stdout, stderr にはそれぞれファイルディスクリプタの番号がついている。stdout は 1, stderr は 2
4. リダイレクト元の指定にはファイルディスクリプタの番号が使える。
2> fileとか1> fileとかできる
5. &NでファイルディスクリプタNを指定できる。&だけだとワイルドカード的に使える
2>&1 とか &> fileとか
なんか他にもありそう