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