web-dev-qa-db-ja.com

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

バッシュで:

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

Zshにいる間:

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

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

18
Tavian Barnes

Zshで mult_iosオプション をオンにして(デフォルトではオン)、

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

1> /dev/null | catは、echoのstdoutの複数のリダイレクトと見なされます。

したがって、echoのstdoutは/dev/nullcatへのパイプの両方にリダイレクトされるようになりました(teeを使用する場合と同様)。

その複数のリダイレクトをキャンセルするには、次のようにします。

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

つまり、/dev/nullにリダイレクトする前にstdoutを閉じる(パイプをキャンセルする)

または、次のようなコマンドグループまたはサブシェルを使用します。

{echo hi 2>&1 1>/dev/null} | cat 
(echo hi 2>&1 1>/dev/null) | cat

このように、echoのstdoutは明示的にのみリダイレクトされますonce(パイプのリダイレクトはグループ/サブシェルに適用され、echo)。

または、multiosを完全に無効にすることもできます。

(setopt nomultios; echo hi 2>&1 > /dev/null | cat)

あるいは、パイプの代わりにプロセス置換を使用することもできます。

echo hi 2> >(cat) > /dev/null

ただし、スクリプトのようにジョブ制御がオフの場合、catプロセスは非同期で実行されることに注意してください(&で開始した場合と同様)。

22