Bashがstdoutをstderrに2回リダイレクトするときに2行( `>&2`と `> / dev / stderr`)を印刷するのはなぜですか?

Bashがstdoutをstderrに2回リダイレクトするときに2行( `>&2`と `> / dev / stderr`)を印刷するのはなぜですか?

次の出力リダイレクトによって2行が印刷されるのはなぜですか?

>&2stdoutをstderrにコピーし、>/dev/stderrstdoutをstderrにリダイレクトします。

echo foo出力はstderrにリダイレクトされるため、出力ラインは1つだけ期待されます。

echo foo >/dev/stderr 2>&1:との2つの出力ラインが表示されないのはなぜですかecho foo >/dev/stdout 2>&1

➜  app git:(python3.10-pipeline) ✗ echo foo >/dev/stderr >&2
foo
foo
➜  app git:(python3.10-pipeline) ✗ echo foo >/dev/stdout >&2
foo
foo

ベストアンサー1

シェルでbash同じストリームを2回リダイレクトすると、ストリームの内容は次にリダイレクトされます。最後(一番右)目的地。実際、bash表示されたコマンドをシェルに入力すると、各コマンドは標準エラーストリームから1行の出力のみを生成します。

しかし、zsh代わりにシェルを使用していますbashzshシェルでは、デフォルトでシェルは同じストリームの複数のリダイレクトを次のように処理します。コピーteeそのストリームは誰かが使用したように見えました。

これは意味する

echo hello >/dev/stderr >&2

または

echo hello >file1 >file2 >file3

標準出力を2回リダイレクトし、ツリー時間をそれぞれリダイレクトすると、次のように標準出力ストリームがコピーされます。

echo hello | tee /dev/stderr >&2

または

echo hello | tee file1 file2 >file3

します。

MULTIOSシェルでシェルオプション()を選択解除してunsetopt MULTIOSこの動作を無効にすることができます。

おすすめ記事