我想做这样的事情:
echo 'foo' | tee /dev/stdout > >(cat)
其中 stdoutecho
被发送到终端和 cat 进程。有没有更简单的方法来做到这一点?
当我运行这个时:
echo 'foo' | tee >(echo 'bar')
由于某种原因,它不回显“foo”,而只回显“bar”,为什么?
答案1
您完全按照您所展示的方式进行操作:
somecommand | tee >(othercommand)
的输出somecommand
将被写入到输入othercommand
和标准输出。
进程替换的问题echo 'bar'
在于它不关心来自tee
from的输入echo 'foo'
,因此它只是bar
尽快输出并终止。然后实用tee
程序尝试写入它,但失败并因此PIPE
在将字符串写入标准输出之前终止(从接收信号)。或者,tee
可能有时间将数据写入进程替换,在这种情况下,bar
和foo
都会打印在标准输出上,它不是确定性的。
您需要确保进程替换中的命令实际上读取发送给它的数据(否则,向它发送数据有什么意义?) 正如比利叔叔在评论中建议的那样,这可以在您的示例中轻松安排,只需使用流程替换即可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