我想做这样的事情:
echo 'foo' | tee /dev/stdout > >(cat)
标准输出从哪里echo
被发送到终端和 cat 进程。有没有更简单的方法来做到这一点?
当我运行这个:
echo 'foo' | tee >(echo 'bar')
出于某种原因,它不回显“foo”它只回显“bar”,为什么?
我想做这样的事情:
echo 'foo' | tee /dev/stdout > >(cat)
标准输出从哪里echo
被发送到终端和 cat 进程。有没有更简单的方法来做到这一点?
当我运行这个:
echo 'foo' | tee >(echo 'bar')
出于某种原因,它不回显“foo”它只回显“bar”,为什么?
您完全按照您展示的方式进行操作:
的输出
somecommand
将写入othercommand
到标准输出的输入和标准输出。您的
echo 'bar'
流程替换的问题在于它不关心来自tee
from的输入echo 'foo'
,因此它只是bar
尽可能快地输出并终止。该tee
实用程序然后尝试写入它,但失败并因此PIPE
在将字符串写入标准输出之前终止(从接收信号)。或者,tee
可能有时间将数据写入进程替换,在这种情况下,两者都bar
将foo
打印在标准输出上,这不是确定性的。您需要确保进程替换中的命令实际读取发送给它的数据(否则,发送数据的意义何在?) 正如比利叔叔在评论中建议的那样,这很容易在您的示例中通过让流程替换只需使用
cat >/dev/null
(假设您对来自的数据不感兴趣tee
):或者
(这两个变体只会在两个字符串的最终输出顺序上有所不同)
接受的答案对我来说不是很清楚,因为结果是通过管道传输到的
/dev/null
,如果管道有效,则模糊不清。要练习确认传递的值,您可以
cat
或使用tr
这样的管道值: