8

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

我目前做的是:

生成器> in.txt && 处理器< in.txt > out.txt && cat in.txt out.txt | 验证者

是否可以在不使用显式文件的情况下获得相同的结果?我已经阅读了有关使用 tee 和进程替换复制输入的信息,但我没有找到一种方法将两个流收集到一个流中以供最后一步。

4

3 回答 3

3

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
于 2013-02-05T13:04:15.407 回答
3

如果您不想在慢速硬盘上创建真实文件,则可以使用 FIFO(先进先出),由于它们的行为,也称为命名管道。

mkfifo myfifo
generator | tee myfifo | processor | verifier myfifo

这会将生成的内容流式传输到tee,然后将其复制到myfifostdout,然后通过管道传输processorverifier. 并且verifier还从myfifo.

于 2013-02-05T10:54:06.020 回答
1

如果您可以将处理器代码更改为按顺序输出,stdin那么stdout单行命令可以很简单,如下所示:

generator | processor | verifier

否则你可以使用这个

generator | tee in.txt | processor | verifier in.txt

tee 命令复制stdout并将一个流重定向到in.txt下一个管道,另一个重定向到下一个管道。在这种情况下,您必须修改verifier以读取 的输出,processor并且stdin生成的文件generator作为参数传递。

我知道您正在寻找一种复制和重定向stdin到的方法,stdout但我不知道这一点,老实说,我认为这是不可能的

于 2013-02-05T10:40:56.033 回答