shell
リダイレクト

cmd > /dev/null 2>&1」の話

More than 3 years have passed since last update.

cmdの出力を捨てたいときに使うんだと認識しているのですが、あんま意味がわかってないので順序追って考えてみた。

前提として
・/dev/nullへリダイレクトすることで出力を破棄している
・1は標準出力, 2は標準エラー出力の予約語的なもの

処理を追ってみる

コマンドを仮に 「ls > /dev/null 2>&1」とする。

1. lsの標準出力を/dev/nullにリダイレクトして破棄
2. 標準エラー出力2の出力を標準出力1に合わせる

実際考えてみると単純。

順番の話

でも前述した内容なら、順番適当でええんちゃうんと思って

 ls 2>&1 > /dev/null

でいいかと思ったんだけど普通にエラー出力でた。
どういうことかと思って調べてるとこんな記事が
http://sonic64.com/2004-03-28.html

リダイレクト処理は、左から右へファイルをオープン/クローズしながら処理が進むよう。
つまり上記のコマンドだと

・1の出力先 [screen] 2の出力先 [screen]

  --- 2の出力先を1の出力先に変更 ---

・1の出力先 [screen] 2の出力先 [screen]

  --- 1の出力先を/dev/nullの出力先に変更 ---

・1の出力先 [/dev/null] 2の出力先 [screen]

となるから、標準エラー出力はスクリーンにでてしまう。