我已经知道如何使用tee
和进程替换来将输出发送到各种命令,例如和 stdout,例如
command0 | tee >(command1) >(command2)
在上面的行中,stdout将由来自command0
,command1
和command2
的交错行组成。
是否有一种方法可以防止tee写入标准输出,而又不删除它通过管道传输到的任何命令的输出?因此,对于上面的示例,stdout仅具有来自command1
和command2
的输出?
与tee
无stdout的处理有关的大多数答案都仅直接写入文件,并建议使用类似以下的内容:
command0 | tee file1 file2 >/dev/null
但是使用进程替换,这也会消耗其他命令的所有输出。
command0 | tee >(command1) >(command2) >/dev/null
是否可以通过某种方法告诉tee
不要打印到标准输出,还是只使用tee
的输出?
答案 0 :(得分:1)
我已经看到comment和answer使用了额外的>
,但是并没有真正解释为什么它会这样做。看来它正在重定向输出某处,但到目前为止,我只能说它完成了我想要的。这有效:
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