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