Bash:如何将一个进程的stdout和stderr传递给两个不同的进程?

时间:2015-07-22 16:59:06

标签: bash pipe stdout stderr

我有一个进程myProcess1,它产生stdout和stderr输出。我想将两个输出流分为两个不同的下游进程myProcess2myProcess3,它们将按摩数据,然后将结果转储到两个不同的文件中。是否可以使用单个命令执行此操作?如果没有,那么第二好的将运行两个单独的命令,一个用于处理stdout,另一个用于stderr。在这种情况下,第一次运行只是:

myProcess1 | myProcess2 > results-out.txt

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

2 个答案:

答案 0 :(得分:2)

没有花哨的游戏,这样的事情应该有效:

filepntr1 = fopen(paths[0], "w");
filepntr2 = fopen(paths[1], "w");
filepntr3 = fopen(paths[2], "w");

使用花哨的游戏(在{ myProcess1 | myProcess2 > results-out.txt; } 2>&1 | myprocess3 > results-err.txt 中不起作用等)你可以这样做:

/bin/sh

答案 1 :(得分:1)

一个或两个命名管道可以很好地工作,但你可能会发现最容易使用多个终端窗口。

在一个终端窗口中:

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