LoginSignup
1
0

More than 3 years have passed since last update.

> /dev/null 2>&1; 順序が逆では駄目な理由

Last updated at Posted at 2019-05-21

後輩に説明するのにググったけどあんまりいい説明がなかった。

ポイント

この謎を解くための前知識。

  • >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")

01.png

これは流石に分かるとおもうので説明は割愛。

STEP2. (echo "hoge" ; ecoh "fuga") > /dev/null まで

$ (echo "hoge" ; ecoh "fuga") > /dev/null

02.png

冒頭に書いたとおり、>1> の省略形である。
つまり標準出力(1)の出力先を変えたことになる。

STEP3. (echo "hoge" ; ecoh "fuga") > /dev/null 2>&1 まで

$ (echo "hoge" ; ecoh "fuga") > /dev/null 2>&1

03.png

冒頭に書いたとおり、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")

01.png

例1.と同じ。説明は割愛。

STEP2. (echo "hoge" ; ecoh "fuga") 2>&1 まで

$ (echo "hoge" ; ecoh "fuga") 2>&1

04.png

冒頭に書いたとおり、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

05.png

冒頭に書いたとおり、>1> の省略形である。
つまり標準出力(1)の出力先を変えたことになる。

このとき標準エラー(2)については出力先を変更していない。
よって上記図のとおり標準出力(1)のみが /dev/null に出力され、
標準エラー(2)についてはコンソール画面に出てしまう。

ということである。

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0