後輩に説明するのにググったけどあんまりいい説明がなかった。
ポイント
この謎を解くための前知識。
-
>は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)についてはコンソール画面に出てしまう。
ということである。




