Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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
Shell 复制stdout,将其传输到两个不同的命令,将结果从两个命令收集到最终程序的stdin_Shell_Unix_Pipe - Fatal编程技术网

Shell 复制stdout,将其传输到两个不同的命令,将结果从两个命令收集到最终程序的stdin

Shell 复制stdout,将其传输到两个不同的命令,将结果从两个命令收集到最终程序的stdin,shell,unix,pipe,Shell,Unix,Pipe,假设我有三个程序:生成器,它生成输入数据,输入到处理器和验证器,验证器可以检查处理器输出对于给定输入是否正确(因此它需要两个文件) 我现在做的是: 生成器>in.txt&&processorout.txt&&cat in.txt out.txt |验证器 不使用显式文件是否可以获得相同的结果?我已经读过关于使用tee和and进程替换复制输入的内容,但我没有找到一种方法将两个流收集到一个流中作为最后一步。如果您可以将处理器代码更改为按顺序输出stdin,则stdout单行命令可以如此简单: gen

假设我有三个程序:生成器,它生成输入数据,输入到处理器验证器,验证器可以检查处理器输出对于给定输入是否正确(因此它需要两个文件)

我现在做的是:

生成器>in.txt&&processorout.txt&&cat in.txt out.txt |验证器


不使用显式文件是否可以获得相同的结果?我已经读过关于使用tee和and进程替换复制输入的内容,但我没有找到一种方法将两个流收集到一个流中作为最后一步。

如果您可以将处理器代码更改为按顺序输出
stdin
,则
stdout
单行命令可以如此简单:

generator | processor | verifier
否则你可以用这个

generator | tee in.txt | processor | verifier in.txt
tee命令复制
stdout
,并将一个流重定向到.txt中的
,将另一个流重定向到下一个管道。在这种情况下,您必须修改
验证器
以从
stdin
读取
处理器
的输出,并且
生成器生成的文件作为参数传递


我知道您正在搜索一种方法来复制并将
stdin
重定向到
stdout
,但我没有意识到这一点,老实说,我认为这是不可能的

如果您不想在慢速硬盘上创建真正的文件,您可以使用FIFO(先进先出),这也称为命名管道,因为他们的行为

mkfifo myfifo
generator | tee myfifo | processor | verifier myfifo

这将生成的内容流式传输到
tee
,tee将其复制到
myfifo
stdout
,stdout通过
处理器
输送到
验证器
。而
验证器
也从
myfifo
获取流

我没有对此进行测试,但请尝试:

{ generator | tee /dev/stderr | processor ; } 2>&1  | verifier
这将把
generator
输出的副本重定向到
stderr
。然后在
生成器的
标准输出上运行
处理器
。然后将两者结合使用&pipe到
验证器

然而,这不能保证从生成器和处理器到验证器的线路的顺序


或者,您可以尝试如下所示的流程替换:

( generator | tee >(processor) ) | verifier

我想我尝试过这种方法,但它不起作用,因为无法保证在验证程序开始读取in.txt之前,它将由tee编写(因此它最终读取空文件)。每个进程都有责任验证输入参数的有效性。如果输入参数无效,只需返回。@KimStrauss,如果要在馈送到
验证器的
生成器
处理器
行之间进行同步,则必须安排
处理器
进行交错。否则,只需按照DavideBerra给出的答案做一些事情:在某处填充输出,然后调用两个上的
验证器即可。最后一个很漂亮。最后一个很漂亮,但便携性较差。iirc它在
bash
中工作,但不能在POSIX中工作。就像那些试图在另一个外壳上使用它的人一样。