“tee”到标准输出和进程的最佳方式

Ale*_*lls 3 bash tee stdout

我想做这样的事情:

echo 'foo' | tee /dev/stdout > >(cat)
Run Code Online (Sandbox Code Playgroud)

其中 stdout 被echo发送到终端和 cat 进程。有没有更简单的方法来做到这一点?

当我运行这个时:

 echo 'foo' | tee >(echo 'bar')
Run Code Online (Sandbox Code Playgroud)

由于某种原因,它不回显“foo”,而只回显“bar”,为什么?

Kus*_*nda 11

您完全按照您所展示的方式进行操作:

somecommand | tee >(othercommand)
Run Code Online (Sandbox Code Playgroud)

的输出somecommand将被写入到输入othercommand和标准输出。

进程替换的问题echo 'bar'在于它不关心来自teefrom的输入echo 'foo',因此它只是bar尽快输出并终止。然后实用程序tee尝试写入它,但失败并因此PIPE在将字符串写入标准输出之前终止(从接收信号)。或者,tee可能有时间将数据写入进程替换,在这种情况下, 和bar都会foo打印在标准输出上,它不是确定性的。

您需要确保进程替换中的命令实际上读取发送给它的数据(否则,发送数据有什么意义?) 正如比利叔叔在评论中建议的那样,这可以在您的示例中轻松安排,方法是让过程替换只需使用cat >/dev/null(假设您对来自的数据不感兴趣tee):

echo 'foo' | tee >(cat >/dev/null; echo 'bar')
Run Code Online (Sandbox Code Playgroud)

或者

echo 'foo' | tee >(echo 'bar'; cat >/dev/null)
Run Code Online (Sandbox Code Playgroud)

(这两种变化仅在两个字符串的最终输出顺序上有所不同)