スポンサーリンク

2>&1の探検


[Linux] 2>&1の探検

エラー出力先


~/.Xclientsを見ると


if [ -n "$PREFERRED" ] && which $PREFERRED >/dev/null 2>&1; then
という行があります。この中の2>&1というのが何を表しているのか分からなかったので調べました。


シェルは標準入力・標準出力・エラー出力の3つのファイルをそれぞれ0,1,2というファイルディスクリプタでオープンしている。


>& 左の出力を右の出力に変更するという意味。
ファイルディスクリプタ0 標準入力(デフォルトはキーボード)
ファイルディスクリプタ1 標準出力(デフォルトはディスプレイ)
ファイルディスクリプタ2 標準エラー出力
よって2>&1は標準エラー出力を標準出力に変更するという意味になります。
さらに標準出力は/dev/nullにリダイレクトされているので捨てられます。
つまり最終的には標準エラー出力と標準出力を捨てるという意味でした。


注意する点はコマンドは右から左の順に解釈されるという点です。


パターン1
command >/dev/null 2>&1
パターン2
command 2>&1 >/dev/null
では結果が違うことになります。


以下のようなシェルスクリプトを作成して実行属性を付けます。


[p047@nobunaga ~]$ cat test.sh
#!/bin/sh
echo "Hello World!!"
cat a.txt
実行するとa.txtは実在しないのでエラーが表示される。

[p047@nobunaga ~]$ ./test.sh
Hello World!!
cat: a.txt: そのようなファイルやディレクトリはありません
パターン1
[p047@nobunaga ~]$ ./test.sh >/dev/null 2>&1
[p047@nobunaga ~]$
パターン2
[p047@nobunaga ~]$ ./test.sh 2>&1 >/dev/null
cat: a.txt: そのようなファイルやディレクトリはありません
[p047@nobunaga ~]$
という結果になりました。
パターン1は説明した通り標準エラー出力を標準出力に変更して捨てますので何も表示されません。
パターン2はコマンドは右から左に実行されますのでまず >/dev/nullが解釈されます。これは1>/dev/nullというこで、標準出力が捨てられることを意味します。その後2>&1が解釈され標準エラー出力が標準出力に変更されディスプレイに表示されます。


このようにコマンドは右から左に実行されることでパターン1とパターン2では異なる結果を生むことに留意しなければなりません。