如何将stderr和stdout重定向到多个位置?

时间:2011-07-25 15:24:40

标签: c unix redirect stderr tee

我需要在bash脚本中执行命令(在freebsd6上),我需要将命令的stderr和stdout发送到控制台,日志文件和Bash变量。

所以,没有任何重定向,我想要的是:

result=`./command | tee output.log`

如果我按原样运行,只有stderr进入控制台,只有stdout会同时使用output.log文件和$ result变量。我理解为什么会这样,但许多尝试不同的重定向都无法将两个流发送到所有三个位置。

如何将stderr和stdout发送到所有三个位置?

1 个答案:

答案 0 :(得分:5)

result=`./command 2>&1 | tee output.log | tee /dev/tty`

[编辑]

早上好在评论中指出,tee接受多个参数:

result=`./command 2>&1 | tee output.log /dev/tty`

[second edit]

在评论中借用Chris的想法,你也可以这样做将输出发送到stderr:

result=`./command 2>&1 | tee /tmp/foo.log >(cat 1>&2)`

要做到你想要的,我发现的最好的是:

exec 3>&1 ; result=`./command 2>&1 | tee /tmp/foo.log >(cat 1>&3)` ; exec 1>&3

(这里的整个问题是反引号重定向stdout在内部的任何内容之前执行。所以这行保存并恢复旧的stdout作为描述符3,这可能是也可能不是一个好主意...)