次のコマンドはzsh v。 4.xと5.xで異なる出力を生成します。
{
(
printf "X\nY\n"
printf "WARNING: foo\nWARNING: bar\n" >&2
printf "1\n2\n"
) 2>&1 >&3 | grep -v foo >&2
} 3>&1
(このコードは、プログラムがstderrに送信した特定の出力を選択的に抑制する方法を示しています。この場合、警告は選択的に抑制され、同時に警告の通過を許可します。foo
最終bar
的にstderr
ストリームはstdout
分離されたままになります。)
v 4.x で端末に表示される出力は予想通りです。
X
Y
1
2
WARNING: bar
WARNING: bar
(この行は他の行と比較して異なる順番になっていることがわかります。)
ただし、v 5.0.7(Debian)および5.1.1(Darwin)で端末に表示される内容は次のとおりです。
X
Y
1
2
WARNING: bar
X
Y
1
2
IOW、送信する行がstdout
2回表示されます。
私は3つの可能性があると思います。
- これはv.5.xのバグです。 (この場合、私の質問は:解決策はありますか?)
- v.5.x zshを正しく設定していません(この場合、私の質問は:必要な動作を得るためにv.5.x zshをどのように設定する必要がありますか?)。
- v。 4.xにはバグがありますが、v。 5.xにはありません。これは私のコードのバグを隠すことです(この場合、私の質問は:v 5を取得するために私のコードを修正する方法です。xで望ましい動作)X? )
答え1
実際、このバグは4.0で修正されました。
multios
あなたが見るのはに固有のオプションの効果ですzsh
。他のシェルと同じ動作を表示するには、このオプションを無効にするか、asをsetopt nomultios
呼び出す必要があります。zsh
sh
multios
inを使用すると、標準出力を両方にリダイレクトし、パイプを両方にリダイレクトできますcmd1 >&3 | cmd2
。バラよりcmd1
&3
cmd2
zshからstderrだけをパイプする方法は?詳細については。