使用Tee将管道输入到两个过程替代

时间:2019-02-15 18:43:45

标签: linux command-line pipe tee process-substitution

是否可以将输入传递给两个流程替换? 可以用tee完成吗?尚未找到解决方案。

我有一个要使用这样的进程替换运行的命令:

cat input.txt | command arg1 arg2 <(command2 </dev/stdin) arg3 <(command3 </dev/stdin) arg4

我试图将输入通过管道传递给command2和command3,但我发现您无法两次从管道读取。

如果可能的话,使用tee进行操作的正确语法是什么?

1 个答案:

答案 0 :(得分:0)

也许您减少了太多示例,但是您可以这样做:

cat input.txt | command arg1 arg2 <(command2 input.txt) arg3 <(command3 input.txt) arg4

或者没有猫。

<input.txt command arg1 arg2 <(command2 input.txt) arg3 <(command3 input.txt) arg4

但是也许在管道之前有一个非常复杂的命令。还是为什么不先将其保存在文件中然后执行上述操作?

仍然,也许输出很大,您不想将其写入文件系统。然后,您可以使用命名管道,但是有一个陷阱。

mkfifo input{1..3} # makes input1, input2, input3 as named pipes (!! named are still part of the file system !!)
complexcommand | tee input{1..3} & # tee will hang till it can send its output, therefor move it to the background with &
<input1 command arg1 arg2 <(command2 <input2) arg3 <(command3 <input3) arg4
rm -f input{1..3} # Since named pipes are part of the filesystem, better cleanup.

注意事项:取决于命令的行为,以上内容可能有效也可能无效。仅当command,command2和command3同时处理数据时才有效。因此,在这种情况下,如果“命令”在从<(command2 <input2)读取任何数据之前决定需要<input1的所有数据,它将永远等待,因为仅在命令请求时才发送一行, command2和command3。