我想要做的只是将执行的命令的stdout重定向到管道。一个例子将比我更好地解释它。
$ echo "Hello world" | cowsay
在cowsay中输出“Hello world”,我想预处理终端的/ bash stdout以通过cowsay
$ echo "Hello world"
这应该输出与第一个命令相同的内容。
提前致谢。
答案 0 :(得分:3)
您可以使用流程替换:
#!/bin/bash
exec > >(cowsay)
echo "Hello world"
然而,有一些警告。如果你在后台开始任何事情,那么母牛将等待它完成:
#!/bin/bash
exec > >(cowsay)
echo "Hello world"
sleep 30 & # Runs in the background
exit # Script exits immediately but no cow appears
在这种情况下,脚本将退出而没有输出。 30秒后,当sleep
退出时,母牛突然出现了。
你可以通过告诉程序在其他地方写字来解决这个问题,这样牛就不必等待它们了:
#!/bin/bash
exec > >(cowsay)
echo "Hello world"
sleep 30 > /dev/null & # Runs in the background and doesn't keep the cow waiting
exit # Script exits and the cow appears immediately.
如果您不在后台开始任何操作,您的某个工具或程序会执行此操作。要找到哪些,请逐一重定向或评论它们,直到出现奶牛。
答案 1 :(得分:2)
您可以使用命名管道:
mkfifo /tmp/cowsay_pipe
cowsay < /tmp/cowsay_pipe &
exec > /tmp/cowsay_pipe # Redirect all future output to the pipe
echo "Hello world"