假设我有三个程序:生成器,它产生馈送到处理器的输入数据,验证器可以检查处理器输出对于给定的输入是否正确(因此它需要两个文件(。
我目前所做的是:
generator > in.txt && processor < in.txt > out.txt && cat in.txt out.txt | verifier
是否可以在不使用显式文件的情况下达到相同的结果?我已经阅读了有关使用 tee 和 and process 替换复制输入的信息,但我没有找到一种方法将两个流收集到一个流中以进行最后一步。
如果您不想在慢速硬盘上创建实际文件,则可以使用 FIFO(先进先出(,由于其行为,它们也称为命名管道。
mkfifo myfifo
generator | tee myfifo | processor | verifier myfifo
这会将生成的内容流式传输到tee
,将其复制到myfifo
和stdout
,后者通过管道processor
传输到verifier
。verifier
也从myfifo
获得流.
我还没有测试过这个,但请尝试:
{ generator | tee /dev/stderr | processor ; } 2>&1 | verifier
这会将generator
输出的副本重定向到 stderr
。然后在stdout
generator
上运行processor
。然后将两者合并并管道到verifier
。
但是,这不能保证来自生成器和处理器的行到达验证器的顺序。
或者,您可以尝试如程替换:
( generator | tee >(processor) ) | verifier
如果可以将处理器代码更改为按顺序stdin
输出,那么stdout
单行命令可以很简单,如下所示:
generator | processor | verifier
否则你可以使用这个
generator | tee in.txt | processor | verifier in.txt
tee 命令复制stdout
并将一个流重定向到in.txt
,另一个流重定向到下一个管道。在这种情况下,您必须修改verifier
以从stdin
读取processor
的输出,并且generator
生成的文件作为参数传递。
我知道您正在寻找一种将stdin
复制并重定向到stdout
的方法,但我不知道这一点,老实说,我认为这是不可能的