stderrがパイプに転送されていますが、私はそれを望んでいません

stderrがパイプに転送されていますが、私はそれを望んでいません

私はこれを持っています:

    echo "$some_command" | bash 2> >(prepend 'r2g-stderr:' 'red') | prepend 'r2g-stdout:' 'yellow';

私がやろうとしていること:

r2g-stderr: this is some stderr
r2g-stderr: this is some more stderr
r2g-stderr: this is some mo mo stderr
r2g-stdout: this is some stdout
r2g-stdout: this more stdout

もちろん、r2g-stderr/r2g-stdoutの色は異なります。

問題は、私が得た出力が次のようになることです。

r2g-stdout: r2g-stderr: this is some stderr
r2g-stdout: r2g-stderr: this is some more stderr
r2g-stdout: r2g-stderr: this is some mo mo stderr
r2g-stdout: this is some stdout
r2g-stdout: this more stdout

プロセス置換のstderrが何とか2番目の前に付くコマンドを作るからだと思いますが、どうすればいいかわかりません。

ベストアンサー1

prepend出力はどこで印刷されますか?到着するのかstderr、到着するのかstdout?プロセスの交換がcmd 2> >(procsub) | ...リダイレクトを継承すると思います。stdoutパイプラインに設定します。

プロセス置換コマンドの出力を明示的に次にリダイレクトするには、次の作業を実行する必要がありますstderr

cmd 2> >(procsub >&2) | pipecmd

または、パイプを別のプロセスと交換します。

cmd 2> >(procsub) 1> >(pipecmd)

後者はよりきれいに見えますが、この場合、結果の出力はすべてstdout(外部環境)に入り、プロセスの交換が完了する前に少なくとも私のBashがプロンプトに戻るため、出力はTogetherプロンプトと混在します。

最初は動作します。

$ bash someoutput.sh  2> >(sed -e 's/^/ERR:/' >&2)  | sed -e 's/^/OUT:/'
ERR:error message
OUT:normal output

ただし、リダイレクト後は、エラー出力と通常出力の元の順序が最後に保持されない可能性があることに注意してください。上記のスクリプトは実際にnormal output文字列を最初に印刷しますが、上記のように、時にはエラー行が最初に表示されます。

おすすめ記事