zshでstderrのみをパイプするにはどうすればよいですか?


18

bashの場合:

$ echo hi 2>&1 1>/dev/null | cat
$

zshの場合:

$ echo hi 2>&1 1>/dev/null | cat
hi
$

標準出力をリダイレクトしながら標準エラーのみをパイプする方法はありますか?

回答:


22

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プロセスは非同期に実行されることに注意してください(で開始されたかのように&)。


3
ありがとう!それを回避する別の方法は(echo hi 2>&1 1>/dev/null) | catです。
タビアンバーンズ

1
@TavianBarnes、良い点、ありがとう。完全を期すために回答に追加しました。また、コマンド・グループ(で動作{echo...}|cat
ステファンChazelas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.