シェル ファイルディスクリプタ 「2>&1」
シェル ファイルディスクリプタ 「2>&1」
普段何気に利用しているリダイレクションにはファイルディスクリプタ番号が隠れています。
例えば(hogeファイルは存在するものとします。)
cat hogeの標準出力をfileへ書き出すというコマンド。
実は上記書き方はファイルディスクリプタ番号が省略されていて
ディスクリプタ番号付きで書くと
となります。
動作的には、cat hoge > fileと同じです。
ファイルディスクリプタ番号の意味は以下のとおり。
ファイルディスクリプタ | 意味 |
---|---|
0 | 標準入力 |
1 | 標準出力 |
2 | 標準エラー |
これらを活用すると、
標準エラーのみファイルに書き出すとか、
標準出力と標準エラーを同一ファイルに書き出すといった事ができます。
標準エラーのみファイルに書き出すには、
※hogeは存在しているファイル。
※hogehogeは存在しないファイル。
hogeファイルの内容は画面(標準出力)に出力されますが、
hogehogeファイルは存在しないためエラーの旨がfileに書き出されます。
標準出力と標準エラーを同一ファイルに書き出すには、
cat hoge hogehoge 1> file 2>&1
※hogeは存在しているファイル。
※hogehogeは存在しないファイル。
上記2つのコマンドはどちらも同じ動作をします。
ファイルディスクリプタ番号が省略されているか否かの違いです。
hogeファイルの内容はfileに書き出されます。
hogehogeファイルは存在しないためエラーの旨がfileに書き出されます。
よく見かけると思いますが、
は、ファイルディスクリプタ2番を1番にまとめるという意味。
つまり標準エラーを標準出力にまとめるということです。
cat hoge hogehoge 2> file
cat hoge hogehoge 1> file 2>&1
※hogeは存在しているファイル。
※hogehogeは存在しないファイル。
これらのコマンドを実際に打って、画面表示(標準出力)とfileの内容を確認するとすぐ理解できると思います。