Bash

stderr 被發送到管道,但我不希望這樣

  • May 7, 2018

我有這個:

   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字元串,但有時錯誤行首先出現,如上所示。

引用自:https://unix.stackexchange.com/questions/442250