通过命令重定向终端stdout

时间:2014-08-18 17:44:55

标签: bash redirect terminal pipe stdout

我想要做的只是将执行的命令的stdout重定向到管道。一个例子将比我更好地解释它。

$ echo "Hello world" | cowsay

在cowsay中输出“Hello world”,我想预处理终端的/ bash stdout以通过cowsay

$ echo "Hello world"

这应该输出与第一个命令相同的内容。

提前致谢。

2 个答案:

答案 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"