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 以某种方式使其成为第二个前置命令,但我不知道如何实现。

答案1

在哪里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首先打印了字符串,但有时错误行首先出现,如上所述。

相关内容