2012年1月25日水曜日

>/dev/null 2>&1になんか納得いかないあなたへ

>/dev/null 2>&1とは?
>/dev/null 2>&1は、コマンドの結果を表示させないときに使う定石です。
 軽く解説すると、
コマンドが正常に処理されて、標準出力に結果が表示されるはずのときも、
コマンドが失敗して、標準エラー出力に結果が表示されるはずのときも、
どっちもひっくるめて、/dev/nullにリダイレクトして、
表示させずにおきましょうってことですね。

え?でもこれって、
command 2>&1 >/dev/null
のがしっくりこない( ・`д・´)??

その気持はわかります。
では、正しい場合と間違いやすい間違いの場合を、
細かく見て行きましょう。
初期状態として
最初はこういう状態です。
標準出力をファイルにかえる。
先に標準出力をファイルに変更します。
command 1>/dev/null
ということですね。
標準出力はファイルを指すようになります。
標準出力はファイルを指すようになります。
いつもどおりの結果です。
標準エラー出力を標準出力が指している先にかえる。
つぎに2>&1の部分です。
「標準出力はどこを指してるんだろう?」と、
標準エラー出力は標準出力がさしてる先を見に行きます。
標準出力と標準エラー出力はファイルを指すようになる。
その結果、標準出力と標準エラー出力は、
同じところ(/dev/null)を指すようになります。
command 2>&1 >/dev/nullの場合(間違い)
先に標準エラー出力は、「標準出力がどこをさしてるんだろう?」
と見に行きます。
先に標準エラー出力は画面を指す。
標準エラー出力は、今標準出力が指している画面を指すようになります。
次に標準出力はファイルを見に行く
標準出力はファイル(/dev/null)をみにいきます。
標準出力は/dev/null、標準エラー出力は画面
先に標準エラー出力は画面を指すようになっていたので、
画面を指し、
標準出力はファイルを指すようになります。
この場合は、エラーが出た場合は画面に出力され、
( ̄ー ̄)ちーーーん
となります。

さて、2>&1の&の部分ですが、
これはC言語のポインタを考えると理解しやすいです。
1を変数と見立てると、2という変数に1のポインタの値を代入していますね。

0 件のコメント:

コメントを投稿