Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash:如何将一个进程的stdout和stderr管道传输到两个不同的进程?_Bash_Pipe_Stdout_Stderr - Fatal编程技术网

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