zsh 5xで可能なリダイレクトのバグ

zsh 5xで可能なリダイレクトのバグ

次のコマンドは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、送信する行がstdout2回表示されます。

私は3つの可能性があると思います。

  1. これはv.5.xのバグです。 (この場合、私の質問は:解決策はありますか?)
  2. v.5.x zshを正しく設定していません(この場合、私の質問は:必要な動作を得るためにv.5.x zshをどのように設定する必要がありますか?)。
  3. v。 4.xにはバグがありますが、v。 5.xにはありません。これは私のコードのバグを隠すことです(この場合、私の質問は:v 5を取得するために私のコードを修正する方法です。xで望ましい動作)X? )

答え1

実際、このバグは4.0で修正されました。

multiosあなたが見るのはに固有のオプションの効果ですzsh。他のシェルと同じ動作を表示するには、このオプションを無効にするか、asをsetopt nomultios呼び出す必要があります。zshsh

multiosinを使用すると、標準出力を両方にリダイレクトし、パイプを両方にリダイレクトできますcmd1 >&3 | cmd2。バラよりcmd1&3cmd2zshからstderrだけをパイプする方法は?詳細については。

関連情報