Bash:如何将一个进程的stdout和stderr管道传输到两个不同的进程?
我有一个进程Bash:如何将一个进程的stdout和stderr管道传输到两个不同的进程?,bash,pipe,stdout,stderr,Bash,Pipe,Stdout,Stderr,我有一个进程myProcess1,它同时生成stdout和stderr输出。我想通过管道将两个输出流导入两个不同的下游进程,myProcess2和myProcess3,这两个进程将对数据进行处理,然后将结果转储到两个不同的文件中。可以用一个命令来完成吗?如果不是,第二个最好的方法是运行两个单独的命令,一个用于处理stdout,另一个是stderr。在这种情况下,第一次运行将是: myProcess1 | myProcess2 > results-out.txt 处理stderr的类似命令
myProcess1
,它同时生成stdout和stderr输出。我想通过管道将两个输出流导入两个不同的下游进程,myProcess2
和myProcess3
,这两个进程将对数据进行处理,然后将结果转储到两个不同的文件中。可以用一个命令来完成吗?如果不是,第二个最好的方法是运行两个单独的命令,一个用于处理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
或
也许值得一提的是,第二个命令需要
bash
,并且由于进程替换而不能与sh
一起工作。第一个命令假设myProcess2本身没有任何stderr输出。如果它这样做了,那么它将最终与myProcess1的stderr合并并传递给myprocess3。如果myProcess2
也向stderr写入一些内容,它将最终进入myprocess3
输入。要解决此问题,命令应该类似于{myProcess1 2>&3|myProcess2>results-out.txt;}3>&1|myprocess3>results err.txt
@Roman True。或者,如果不需要,从myprocess2
关闭stderr
,和/或显式重定向到标准输出或tty。
myProcess3 < stderr.pipe
myProcess1 2> stderr.pipe | myProcess2
{ myProcess1 > stdout.pipe; } 2>&1 | myProcess3