回答:
zshを使用し、mult_iosオプションをオン(デフォルトでオン)にした場合:
echo hi 2>&1 1>/dev/null | cat
1> /dev/null | cat複数のリダイレクトと見られているechoの標準出力。
したがって、echoのstdoutは、両方/dev/nullとパイプにリダイレクトされますcat(を使用しているかのようにtee)。
その複数のリダイレクトをキャンセルするには、次のようにします。
echo hi 2>&1 >&- > /dev/null | cat
つまり、リダイレクトする前にstdoutを閉じる(パイピングをキャンセルする) /dev/null
または、次のようなコマンドグループまたはサブシェルを使用します。
{echo hi 2>&1 1>/dev/null} | cat
(echo hi 2>&1 1>/dev/null) | cat
そのようにして、echoのstdoutは明示的に一度だけリダイレクトされます(パイプリダイレクトはグループ/サブシェルに適用され、継承されますecho)。
または、multios完全に無効にすることができます:
(setopt nomultios; echo hi 2>&1 > /dev/null | cat)
または、パイプの代わりにプロセス置換を使用できます。
echo hi 2> >(cat) > /dev/null
ただし、ジョブ制御がオフの場合(スクリプトの場合など)、catプロセスは非同期に実行されることに注意してください(で開始されたかのように&)。
{echo...}|cat)
(echo hi 2>&1 1>/dev/null) | catです。