stdout/stderrと/dev/nullの混乱した動作

stdout/stderrと/dev/nullの混乱した動作

私はこのようなコマンドを理解しようとしています

[command] > /dev/null 2>&1

私が正しく理解した場合、コマンドの出力は(ファイル記述子2)にリダイレクトされ、次に/dev/null(ファイル記述子1)にリダイレクトされます。stderrstdout

最終結果は[command]エラーのみが出力されることです。

これを理解するために、次のコマンドを実行しました。

bash-3.2$ echo "Hello World" 1>&2
Hello World

ここでは「Hello World」をエコーし​​てリダイレクトしますstderr。次に、次のコマンドを実行します。

bash-3.2$ echo "Hello World" 1>&2 2>&1
Hello World

予想通りstderrにリダイレクトしています。stdoutHello World

今私はこれを実行します

bash-3.2$ echo "Hello World" 1>&2 1>&1
Hello World

私が望むのは、出力を印刷することですstdout。しかし。stdoutstderr

それでは、なぜ印刷するのですかHello World?何も印刷されないと思いました。

答え1

echo "Hello World" 1>&2 1>&1

ファイル記述子1(標準出力)をファイル記述子2(標準エラー)が指す場所にリダイレクトし、ファイル記述子1を自分にリダイレクトします。したがって、すべての出力は標準エラーに移動しますが、それを変更しませんでした。したがって、すべての出力は現在の端末に移動します。

何も印刷したくない場合は、標準エラーをリダイレクトする必要があります。

(echo "Hello World" 1>&2 1>&1) 2> /dev/null

または等しく、

echo "Hello World" 2>/dev/null 1>&2

あなたの解釈

[command] > /dev/null 2>&1

不正確:> /dev/null標準出力をにリダイレクト/dev/nullし、標準エラーを現在指している標準出力にリダイレクトします/dev/null。したがって、すべての出力が削除されます。

バラよりシェルの制御およびリダイレクト演算子は何ですか?もっと学ぶ。

関連情報