STDERR のみをフィルターに通す 質問する

STDERR のみをフィルターに通す 質問する

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により、filterSTDOUT が元の STDERR に戻ります。

おすすめ記事