bashでSTDERRをフィルターに通してSTDOUTと統合する方法はありますか?つまり、
STDOUT ────────────────┐
├─────> terminal/file/whatever
STDERR ── [ filter ] ──┘
それよりも
STDOUT ────┐
├────[ filter ]───> terminal/file/whatever
STDERR ────┘
ベストアンサー1
要約:
$ cmd 2> >(stderr-filter >&2)
例:
% cat /non-existant 2> >(tr o X >&2)
cat: /nXn-existant: NX such file Xr directXry
%
これはbashとzshの両方で動作します。bashは今日ではかなり普及していますが、もしPOSIX用の(本当に厄介な)ソリューションが本当に必要ならsh
、こちらをご覧ください。
説明
これまでのところ、これを行う最も簡単な方法は、STDERRをリダイレクトすることです。プロセス置換:
プロセス置換は、ファイル名を使用してプロセスの入力または出力を参照することを可能にします。これは次の形式をとります。
>(list)
プロセス リストは非同期で実行され、その入力または出力はファイル名として表示されます。
したがって、プロセス置換によって取得されるのはファイル名です。
次のようにすることもできます:
$ cmd 2> filename
できるよ
$ cmd 2> >(filter >&2)
リダイレクト>&2
により、filter
STDOUT が元の STDERR に戻ります。