バッシュで:
$ echo hi 2>&1 1>/dev/null | cat
$
Zshにいる間:
$ echo hi 2>&1 1>/dev/null | cat
hi
$
標準出力をリダイレクトするときに標準エラーのみをパイプする方法はありますか?
Zshで mult_ios
オプション をオンにして(デフォルトではオン)、
echo hi 2>&1 1>/dev/null | cat
1> /dev/null | cat
は、echo
のstdoutの複数のリダイレクトと見なされます。
したがって、echo
のstdoutは/dev/null
とcat
へのパイプの両方にリダイレクトされるようになりました(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
プロセスは非同期で実行されることに注意してください(&
で開始した場合と同様)。