复制标准输出,将其通过管道传输到两个不同的命令,从两个命令收集结果到最终程序的 stdin



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

我目前所做的是:

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,将其复制到myfifostdout,后者通过管道processor传输到verifierverifier也从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的方法,但我不知道这一点,老实说,我认为这是不可能的

相关内容

  • 没有找到相关文章

最新更新