回答:
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
です。