Bash T形三通仅适用于命令,不适用于标准输出

Bash T形三通仅适用于命令,不适用于标准输出,bash,tee,Bash,Tee,我已经知道如何使用tee和进程替换将输出发送到各种命令,以及stdout,例如 command0 | tee>(command1)>(command2) 使用上述行,stdout将由来自command0、command1和command2的交错行组成 有没有一种方法可以防止tee写入stdout,而不删除它所传输到的任何命令的输出?因此,对于上面的示例,stdout是否仅具有来自command1和command2的输出? 大多数与没有标准输出的teeing相关的答案都只是直接写入文件,建议使用

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

command0 | tee>(command1)>(command2)
使用上述行,stdout将由来自
command0
command1
command2
的交错行组成

有没有一种方法可以防止tee写入stdout,而不删除它所传输到的任何命令的输出?因此,对于上面的示例,stdout是否仅具有来自
command1
command2
的输出? 大多数与没有标准输出的
tee
ing相关的答案都只是直接写入文件,建议使用如下方式:

command0 | tee file1 file2>/dev/null
但如果使用进程替换,也会消耗其他命令的所有输出

command0 | tee>(command1)>(command2)>/dev/null
有没有办法告诉
tee
不要打印到stdout,或者只直接使用
tee
的输出?

我见过一个和一个使用额外
的,但没有真正解释它为什么这样做。它似乎是在将输出重定向到某个地方,但到目前为止,我所能说的就是它实现了我所期望的。这项工作:

command0 | tee>>(command1)>(command2)
command0 | tee>(command1)>>(command2)
额外的
>
在哪里似乎无关紧要,只要它在
tee
的至少一个参数之前。所以这是行不通的:

command0|tee>(command1)>(command2)>
不知道这叫什么,也没有进一步的线索,我无法进一步解释。

试试这个:

( command0 | tee >(command1 1>&3 ) | command2 ) 3>&1
它将command1的标准输出重定向到管道3,以便command2只看到原始源。最后,再次将管道3重定向到标准输出

使用此选项对其进行测试:

( echo test | tee >( sed 's/^/1 /' >&3 )  | sed 's/^/2 /' ) 3>&1
输出是无序的,在我的情况下:

2 test
1 test

>(foo)
重定向到
>(foo)
。进程替换涉及到将
>(foo)
替换为表示
foo
的stdin的文件路径,因此可以将其视为
tee>/some/stdin1/some/stdin2
,或者等效为
tee/some/stdin2>/some/stdin1
,这应该清楚地表明发生了什么。这让我认为它会向流程发送一个额外的管道输出副本,但我从经验上知道情况并非如此。链接的文档也不在任何地方提及这种模式。哦,你是说<代码>(FoO)不再是在<代码> >(FoO)<代码>的情况下对TEE的一个参数,而只是命令中间的一个重定向?是的,<代码> >(FoO)是命令中间的重定向。只要把
>(foo)
想象成一个文件的路径(一个特殊的文件,但仍然是一个文件)。我刚刚意识到,我不确定我是如何得出结论,在这种情况下
/dev/null
失败的,因为它不会。它只捕获
tee
标准输出的输出,而不捕获它发送输出到的进程。