假设我有三个程序:生成器,它产生输入数据馈送到处理器和验证器,它可以检查处理器输出对于给定输入是否正确(因此它需要两个文件)。
我目前做的是:
生成器> 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
但我不知道这一点,老实说,我认为这是不可能的