自动将所有stderr和stdout捕获到文件中,并仍显示在控制台上

时间:2012-01-02 13:40:09

标签: bash

我正在寻找一种方法来捕获文件的所有标准输出和标准错误,同时还将其输出到控制台。所以:

(set it up here)
set -x # I want to capture every line that's executed too
cat 'foo'
echo 'bar'

现在foo和bar的输出以及set -x的调试输出将被记录到某个日志文件中并显示在控制台上。

我无法控制文件的调用方式,因此需要在文件的开头设置。

3 个答案:

答案 0 :(得分:5)

您可以使用exec和进程替换将脚本内的stdout和stderr发送到tee。进程替换是一种基础,因此它不可移植,如果将bash称为/ bin / sh或使用--posix,则无法工作。

exec > >(tee foo.log) 2>&1
set -x # I want to capture every line that's executed too
cat 'foo'
echo 'bar'
sleep 2 

睡眠被添加到最后,因为控制台的输出将由发球台缓冲。睡眠将有助于防止提示在输出完成之前返回。

答案 1 :(得分:1)

也许创建一个调用真实脚本的代理脚本,将stderr重定向到stdout并将其管道传输到tee

这样的事情:

#!/bin/bash
/path/to/real/script "$@" 2>&1 | tee file

答案 2 :(得分:1)

如果你只想在控制台上STDERR,你可以:

#!/bin/bash
set -e 
outfile=logfile

exec > >(cat >> $outfile)
exec 2> >(tee -a $outfile >&2)

# write your code here