バッシュから:
$ 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 | cat
stdoutのマルチリダイレクトとして扱われます。echo
したがって、echo
stdoutは/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
これにより、echo
stdoutは明示的にのみリダイレクトされます。一度(パイプリダイレクトはグループ/サブシェルに適用され、継承されますecho
。)
または、multios
完全に無効にすることもできます。
(set +o multios; echo hi 2>&1 > /dev/null | cat)
または、次のものを使用できます。プロセスの交換パイプの代わりに:
echo hi 2> >(cat) > /dev/null
ただし、ジョブ制御がオフになると(スクリプトのように)、プロセスは非同期でcat
実行されます(起動したように&
)。