我需要在bash脚本中执行命令(在freebsd6上),我需要将命令的stderr和stdout发送到控制台,日志文件和Bash变量。
所以,没有任何重定向,我想要的是:
result=`./command | tee output.log`
如果我按原样运行,只有stderr进入控制台,只有stdout会同时使用output.log文件和$ result变量。我理解为什么会这样,但许多尝试不同的重定向都无法将两个流发送到所有三个位置。
如何将stderr和stdout发送到所有三个位置?
答案 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,这可能是也可能不是一个好主意...)