假设我有三个程序:生成器,它产生输入数据馈送到处理器和验证器,它可以检查处理器输出对于给定输入是否正确(因此它需要两个文件)。
我目前做的是:
生成器> in.txt && 处理器< in.txt > out.txt && cat in.txt out.txt | 验证者
是否可以在不使用显式文件的情况下获得相同的结果?我已经阅读了有关使用 tee 和进程替换复制输入的信息,但我没有找到一种方法将两个流收集到一个流中以供最后一步。
I have not tested this, but try:
{ generator | tee /dev/stderr | processor ; } 2>&1 | verifier
This will redirect a copy of generator output to stderr. Then run processor on stdout of generator. Then combine both & pipe to verifier.
However, this cannot guarantee the order, in which lines from generator & processor would reach verifier.
Alternately, you can try process substitution like below:
( generator | tee >(processor) ) | verifier
如果您不想在慢速硬盘上创建真实文件,则可以使用 FIFO(先进先出),由于它们的行为,也称为命名管道。
mkfifo myfifo
generator | tee myfifo | processor | verifier myfifo
这会将生成的内容流式传输到tee,然后将其复制到myfifo和stdout,然后通过管道传输processor到verifier. 并且verifier还从myfifo.
如果您可以将处理器代码更改为按顺序输出,stdin那么stdout单行命令可以很简单,如下所示:
generator | processor | verifier
否则你可以使用这个
generator | tee in.txt | processor | verifier in.txt
tee 命令复制stdout并将一个流重定向到in.txt下一个管道,另一个重定向到下一个管道。在这种情况下,您必须修改verifier以读取 的输出,processor并且stdin生成的文件generator作为参数传递。
我知道您正在寻找一种复制和重定向stdin到的方法,stdout但我不知道这一点,老实说,我认为这是不可能的