後輩に説明するのにググったけどあんまりいい説明がなかった。
ポイント
この謎を解くための前知識。
-
>
は1>
の省略形であるということ - リダイレクトは左から順番に処理されるということ
-
2>&1
は「標準エラーの出力先を標準出力にする」ではなく、
「標準エラーの出力先を標準出力と同じ場所にする」であるということ
図解
例文
$ (echo "hoge" ; ecoh "fuga")
hoge
-bash: ecoh: コマンドが見つかりません
-
hoge
が標準出力 -
-bash: ecoh: コマンドが見つかりません
が標準エラー
例1: > /dev/null 2>&1
の場合
例文
$ (echo "hoge" ; ecoh "fuga") > /dev/null 2>&1
STEP1. (echo "hoge" ; ecoh "fuga")
まで
$ (echo "hoge" ; ecoh "fuga")
これは流石に分かるとおもうので説明は割愛。
STEP2. (echo "hoge" ; ecoh "fuga") > /dev/null
まで
$ (echo "hoge" ; ecoh "fuga") > /dev/null
冒頭に書いたとおり、>
は 1>
の省略形である。
つまり標準出力(1)の出力先を変えたことになる。
STEP3. (echo "hoge" ; ecoh "fuga") > /dev/null 2>&1
まで
$ (echo "hoge" ; ecoh "fuga") > /dev/null 2>&1
冒頭に書いたとおり、2>&1
は、標準エラー(2)の出力先を標準出力(1)と同じ場所にするである。
したがって、図のとおり出力先は /dev/null
となる。
例2: 2>&1 > /dev/null
の場合
例文
$ (echo "hoge" ; ecoh "fuga") 2>&1 > /dev/null
STEP1. (echo "hoge" ; ecoh "fuga")
まで
$ (echo "hoge" ; ecoh "fuga")
例1.と同じ。説明は割愛。
STEP2. (echo "hoge" ; ecoh "fuga") 2>&1
まで
$ (echo "hoge" ; ecoh "fuga") 2>&1
冒頭に書いたとおり、2>&1
は、標準エラー(2)の出力先を標準出力(1)と同じ場所にするである。
標準出力(1)、標準エラー(2)ともに出力先はもともと「コンソール画面」である。
ここで標準エラー(2)の出力先を標準出力(1)と同じ場所にするということは、出力先を「コンソール画面」にするということ。
つまり何も変っていない。
STEP3. (echo "hoge" ; ecoh "fuga") 2>&1 > /dev/null
まで
$ (echo "hoge" ; ecoh "fuga") 2>&1 > /dev/null
冒頭に書いたとおり、>
は 1>
の省略形である。
つまり標準出力(1)の出力先を変えたことになる。
このとき標準エラー(2)については出力先を変更していない。
よって上記図のとおり標準出力(1)のみが /dev/null
に出力され、
標準エラー(2)についてはコンソール画面に出てしまう。
ということである。