通过命令重定向终端标准输出流

6

我想要做的就是将执行命令的标准输出重定向到一个管道中。下面的例子会更好地解释。


$ echo "Hello world" | cowsay

在cowsay中输出“Hello world”,我想预处理终端/ bash的标准输出,使其通过cowsay

$ echo "Hello world"

这应该输出与第一个命令相同的结果。
提前感谢您。
2个回答

4
你可以使用进程替代:
#!/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.

如果您没有在后台启动任何内容,那么可能是您的某个工具或程序在运行。为了找到这些问题,可以逐个取消重定向或注释它们,直到问题出现。


这对我没有起作用,所有的标准输出都被清除了,在屏幕上什么也没有显示。 - Joan Font
@JoanFont编辑了答案,添加了演示。它有效。如果对您无效,请提供更多细节。 - clt60
@jm666 我已经尝试过使用 cat -n 并且它可以工作,但是当我通过 cowsay 时输出为空。 - Joan Font
@JoanFont 请在将示例应用于您自己的程序之前先尝试使用它。在您的情况下,您或您调用的工具可能会在后台启动某些进程(例如cowsay将等待它们退出以防止其输出一些应该由牛说出的内容)。 - that other guy

3
您可以使用命名管道:
mkfifo /tmp/cowsay_pipe
cowsay < /tmp/cowsay_pipe &
exec > /tmp/cowsay_pipe # Redirect all future output to the pipe
echo "Hello world"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接