3

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

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

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

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

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

4

1 回答 1

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

[编辑]

正如 nm 在评论中指出的那样,tee接受多个参数:

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

[第二次编辑]

在评论中借用 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

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

于 2011-07-25T15:32:00.413 回答