Bash:如何将一个进程的stdout和stderr管道到两个不同的进程



我有一个进程myProcess1,它同时产生标准输出和标准错误输出。我想将两个输出流管道到两个不同的下游进程,myProcess2myProcess3,这将对数据进行处理,然后将结果转储到两个不同的文件中。有可能用一个命令来完成吗?如果没有,第二种方法是运行两个单独的命令,一个处理stdout,另一个处理stderr。在这种情况下,第一次运行将是:

myProcess1 | myProcess2 > results-out.txt

处理stderr的类似命令是什么?Thx

没有花哨的游戏,像这样的东西应该工作:

{ myProcess1 | myProcess2 > results-out.txt; } 2>&1 | myprocess3 > results-err.txt

对于高级游戏(不能在/bin/sh等中工作),您可以这样做:

myProcess1 2> >(myprocess3 > results-err.txt) | myProcess2 > results-out.txt

使用一两个命名管道就可以了,但是您可能会发现使用多个终端窗口更容易。

在一个终端窗口中:

mknod stdout.pipe p
mknod stderr.pipe p
myProcess1 > stdout.pipe 2> stderr.pipe

在第二个窗口中:

myProcess2 < stdout.pipe

第三个:

myProcess3 < stderr.pipe

使用后台进程和一些其他技巧,你可以在一个窗口中完成所有工作,但是保持次要进程的输出分离将是另一个挑战…

您可以使用以下任何一种方法消除一个命名管道(从而消除一个额外的窗口):

myProcess1 2> stderr.pipe | myProcess2

{ myProcess1 > stdout.pipe; } 2>&1 | myProcess3

最新更新