Bash
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 以某種方式使其成為第二個前置命令的方式,但我不知道如何。
在哪裡
prepend
列印它的輸出?去stderr
還是去stdout
?我認為程序替換cmd 2> >(procsub) | ...
繼承*stdout
*了管道設置的重定向。您需要執行以下操作才能將程序替換命令的輸出顯式重定向到
stderr
:cmd 2> >(procsub >&2) | pipecmd
或用另一個程序替換替換管道:
cmd 2> >(procsub) 1> >(pipecmd)
後者對我來說看起來更乾淨,但在這種情況下,所有結果輸出都進入
stdout
(外部環境),並且至少我的 Bash 在程序替換完成之前返回到提示符,因此輸出與提示符混合在一起。第一個雖然有效:
$ bash someoutput.sh 2> >(sed -e 's/^/ERR:/' >&2) | sed -e 's/^/OUT:/' ERR:error message OUT:normal output
但請記住,重定向後,錯誤輸出和正常輸出的原始順序可能不會保留在末尾。我上面的腳本實際上首先列印了
normal output
字元串,但有時錯誤行首先出現,如上所示。