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

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

我想做这样的事情:

echo 'foo' | tee /dev/stdout > >(cat)

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

当我运行这个时:

 echo 'foo' | tee >(echo 'bar')

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

答案1

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

somecommand | tee >(othercommand)

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

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

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

echo 'foo' | tee >(cat >/dev/null; echo 'bar')

或者

echo 'foo' | tee >(echo 'bar'; cat >/dev/null)

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

答案2

接受的答案对我来说不是很清楚,因为结果通过管道传输到/dev/null,从而掩盖了管道是否有效。

要练习确认值已传递,您可以cat或使用tr管道值,如下所示:

% echo foo | tee >(tr -d '\n') ; echo bar
foo
foobar

答案3

echo 'foo' | tee /dev/tty |other-program

相关内容