標準出力の記録とエラー履歴を一緒に取るためにコマンドラインで次のような記述 をすると思います。
この動作を追いかけてみます。リダイレクト機能表でも分かるように$ command >foo 2>&1
>&
の
働きは、左側に書かれたファイルディスクリプタの出力を右側に書かれたファイルディ
スクリプタに変更することです。
シェルは標準入力・標準出力・エラー出力の3つのファイルをオープンしています。
そして、それらをファイルディスクリプタ0、1、2として管理しています。
ですから 2>&1
はファイルディスクリプタ2を1に、つまりエラー出力を標準
出力に変更することになります。さらに、>foo
として標準出力がfooにリダイレク
トされていますから、fooには標準出力とエラー出力がマージされたものが書き出され
ることになります。
リダイレクトのメカニズムを理解する上で大切なことは、コマンドラインで記述された
ものが
右から左の順
に実行されるということです。エラー出力を標準出力にマージする
この例では、まず最初に 2>&1
が実行されてから >foo
が実行されます。
もし、コマンドラインで
と書いたならば違った結果になってしまいます。どうなるかはご自分でお試しください。$ command 2>&1 >foo