Bash:如何将一个进程的标准输出和标准错误通过管道传输到两个不同的进程?

Bash: how do I pipe stdout and stderr of one process to two different processes?

我有一个进程 myProcess1 可以同时生成 std​​out 和 stderr 输出。我想将两个输出流通过管道传输到两个不同的下游进程,myProcess2myProcess3,这将处理数据,然后将结果转储到两个不同的文件中。是否可以使用单个命令来完成?如果没有,第二好的方法是 运行 设置两个单独的命令,一个处理 stdout,另一个处理 stderr。在这种情况下,第一个 运行 将只是:

myProcess1 | myProcess2 > results-out.txt

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

如果没有花哨的游戏,这样的东西应该可行:

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

对于花哨的游戏(在 /bin/sh 等中不起作用),您可以这样做:

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

一两个命名管道可以很好地解决这个问题,但您可能会发现使用多个终端最简单 windows。

在一个终端中window:

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

秒后window:

myProcess2 < stdout.pipe

第三个:

myProcess3 < stderr.pipe

使用后台进程和其他一些技巧,您可以在一个 window 中完成所有工作,但是保持辅助进程的输出分离将是另一个挑战。 ..

您可以使用以下任一方法消除一个命名管道(因此消除一个额外的 windows):

myProcess1 2> stderr.pipe | myProcess2

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