zshからstderrだけをパイプする方法は?

zshからstderrだけをパイプする方法は?

バッシュから:

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

zshから:

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

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

ベストアンサー1

zshを使ってmult_iosオプション次の場所で開く(デフォルトで開く)

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

1> /dev/null | catstdoutのマルチリダイレクトとして扱われます。echo

したがって、echostdoutは/dev/nullパイプとパイプの両方にリダイレクトされますcat(使用するのと同じようにtee)。

複数のリダイレクトをキャンセルするには:

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

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

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

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

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

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

(set +o multios; echo hi 2>&1 > /dev/null | cat)

または、次のものを使用できます。プロセスの交換パイプの代わりに:

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

ただし、ジョブ制御がオフになると(スクリプトのように)、プロセスは非同期でcat実行されます(起動したように&)。

おすすめ記事