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

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

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

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

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

最佳答案
您可以使用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 

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

转载注明原文:bash – 自动将所有stderr和stdout捕获到文件中,并仍然显示在控制台上 - 代码日志