次の出力リダイレクトによって2行が印刷されるのはなぜですか?
>&2
stdoutをstderrにコピーし、>/dev/stderr
stdoutを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
代わりにシェルを使用していますbash
。zsh
シェルでは、デフォルトでシェルは同じストリームの複数のリダイレクトを次のように処理します。コピー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
この動作を無効にすることができます。