2>&1 は何をやっているのか
シェルのリダイレクトとか、ファイルディスクリプタとかで混乱したのでメモ。
しばしばシェルスクリプトなどで、標準エラー出力と標準出力の両方をまとめてファイルにリダイレクトする場合、以下のような書き方をする。
ls > dirlist 2>&1
正直どいういう理屈なのかわからずつかっていた。
2>&1
は具体的になにをしているのか?
man bashより
リダイレクトの順番には意味がある点に注意してください。 例えば、次のコマンド ls > dirlist 2>&1 は標準出力と標準エラー出力を両方ともファイル dirlist に書き込みますが、次のコマンド ls 2>&1 > dirlist では標準出力だけがファイル dirlist に書き込まれます。なぜなら後者の場合には、標準エラー出力は dirlist にリダイレクトされる前の標準出力の複製となるからです。
2>&1
はファイル・ディスクリプタ1を複製し、ファイル・ディスクリプタ2を作成することことらしい。そうすることで標準エラー出力の向き先が"現時点"の標準出力の向き先にと同じになる。
コマンドは左側から解釈されるため、下記のように書いた場合
>dirlist
によって標準出力(fd1)の向き先がdirlistに変わったあと、2>&1
によって、標準エラー出力(fd2)の向き先が標準出力(fd1)と同じdirlistに変わっている。
ls > dirlist 2>&1
下記ように 2>&1
を >dirlist
より先に書いた場合、標準エラー出力(fd2)の向き先は標準出力(fd1)と同じ端末になった後、> dirlist
によって、標準出力先のみ dirlistになる。
ls 2>&1 > dirlist