发球到仅命令,而不是stdout

时间:2019-04-05 03:36:57

标签: bash tee

我已经知道如何使用tee和进程替换来将输出发送到各种命令,例如 stdout,例如

command0 | tee >(command1) >(command2)

在上面的行中,stdout将由来自command0command1command2的交错行组成。

是否有一种方法可以防止tee写入标准输出,而又不删除它通过管道传输到的任何命令的输出?因此,对于上面的示例,stdout仅具有来自command1command2的输出? 与tee无stdout的处理有关的大多数答案都仅直接写入文件,并建议使用类似以下的内容:

command0 | tee file1 file2 >/dev/null

但是使用进程替换,这也会消耗其他命令的所有输出。

command0 | tee >(command1) >(command2) >/dev/null

是否可以通过某种方法告诉tee不要打印到标准输出,还是只使用tee的输出?

2 个答案:

答案 0 :(得分:1)

我已经看到commentanswer使用了额外的>,但是并没有真正解释为什么它会这样做。看来它正在重定向输出某处,但到目前为止,我只能说它完成了我想要的。这有效:

command0 | tee > >(command1) >(command2)
command0 | tee >(command1) > >(command2)

多余的>在哪里似乎无关紧要,只要它在tee的至少一个参数之前。所以这行不通:

command0 | tee >(command1) >(command2) >

在不知道这叫什么的情况下,没有进一步的线索,我无法进一步解释。

答案 1 :(得分:1)

尝试一下:

( command0 | tee >(command1 1>&3 ) | command2 ) 3>&1

它将命令1的标准输出重定向到管道3,以便命令2仅看到原始源。最后,将管道3重新重定向到stdout。

使用它进行测试:

( echo test | tee >( sed 's/^/1 /' >&3 )  | sed 's/^/2 /' ) 3>&1

输出无序,在我的情况下:

2 test
1 test