抱歉,如果这是一个愚蠢的问题,但我正在尝试完成类似的事情,但一行:
$ prog1 | prog2
$ prog1 | prog3
所以,我基本上想执行 prog1 并将输出分别通过管道传输到 prog2 和 prog3 (不是链式管道)。起初,我尝试使用 tee 但这似乎不对,因为它将输出转储到文件中(这不是我想要的)。
$ prog1 | tee prog2 | prog3 # doesn't work - creates file "prog2"
在某些时候,我可能想将其扩展到将输出传输到两个以上的程序,但我现在只是开始简单。
$ prog1 | prog2
$ prog1 | prog3
$ prog1 | prog4
...
答案1
工艺替代。
... | tee >(prog2) | ...
答案2
与 Ignacio 的答案类似,您可以使用临时命名管道mkfifo(1)
。
mkfifo /tmp/teedoff.$$; cmd | tee /tmp/teedoff.$$ | prog2 & sleep 1; prog3 < /tmp/teedoff.$$; rm /tmp/teedoff.$$
它有点冗长,但它可以在没有进程替换的系统上工作,例如dash
.这sleep 1
是为了处理任何竞争条件。
答案3
有一个小实用程序聚四氟乙烯它的作用是:
prog1 | ptee 2 3 4 2> >(prog2) 3> >(prog3) 4> >(prog4)
而不是写入文件,聚四氟乙烯写入命令行上给出的所有 fd。
聚四氟乙烯是其一部分管道执行器。
答案4
你不需要任何 bashisms 或特殊文件或任何这些 - 无论如何在 Linux 中都不需要:
% { prog1 | tee /dev/fd/3 | prog2 >&2 ; } 3>&1 | prog3
{ { printf %s\\t%s\\t%s\\n \
"this uneven argument list" \
"will wrap around" to \
"different combinations" \
"for each line." "Ill pick out" \
"a few words" "and grep for them from" \
"the same stream." |
tee /dev/fd/3 /dev/fd/4 |
grep combination >&2 ; } 3>&1 |
grep pick >&2 ; } 4>&1 |
grep line
different combinations for each *line.* Ill pick out
different combinations for each line. Ill *pick* out
different *combinations* for each line. Ill pick out
我对突出显示的结果加了星标,以表明它们不仅是来自同一流的三个结果,而且还是单独流程匹配grep
的结果。grep