別の例を見てみましょう。 最初のコマンド (ls
) は有効なコマンドですが、2 番目のコマンド (ls -0
) は不正なオプション -0
が含まれているため無効なコマンドです。
これは有効なコマンドです:
$ ls
Applications Documents Library Music Public$ echo $?
0
次に、無効なコマンドを見てみます:
$ ls -0
ls: illegal option -- 0
usage: ls $ echo $?
1
このスクリプトで問題となるのは、エラー メッセージが STDERR
へ表示されてしまうということです。 しかし、私たちのスクリプトでは、エラーメッセージを表示しないようにしたいのです。
> /dev/null 2>&1
でもう一度試してみましょう:
$ ls -0 > /dev/null 2>&1
$ echo $?
1
今度はエラーメッセージが表示されないことに注意してください。 これを分解すると、ls -0
コマンドのエラー出力 (stderr
) を抑制し、標準出力 (stdout
) にリダイレクトし、/dev/null
に書き込んで、すぐに破棄しているのです。 >&
記号は、最初のファイルディスクリプタ(2)の出力をコピーして、2番目のファイルディスクリプタ(1)の出力にリダイレクトする演算子です。
さて、このファイルディスクリプタの表を見て、2>&1
の数字が何を表しているかを見ていきましょう。
/dev/null
ではなく通常のファイルへの出力で確認できます.
$ ls -0 > /tmp/devnull 2>&1
$ echo $?
1$ cat /tmp/devnull
ls: illegal option -- 0
usage: ls