将脚本变量重定向到日志文件而不丢失 stderr

将脚本变量重定向到日志文件而不丢失 stderr

当在 bash 脚本中设置“set -x”时,或者如果使用 运行脚本bash -x,您将得到所有参数与标准输出一起打印到屏幕上。

是否可以将 stderr 和 stdout 打印到屏幕上,但将输出重定向set -x到日志文件而不将其打印到屏幕上?

这个想法是拥有我可以在日志中获取的所有信息,但只将常规的 stdout 和 stderr 打印到屏幕上。

答案1

user1@mac1:~/tmp$ cat t1.sh
exec 4>shell.log
BASH_XTRACEFD=4

set -x
echo abc
cat ffff

user1@mac1:~/tmp$ bash t1.sh
abc
cat: ffff: No such file or directory
user1@mac1:~/tmp$ cat shell.log
+ echo abc
+ cat ffff
user1@mac1:~/tmp$ 

答案2

输出set -x转到stderr.您需要做的是重定向stderr,例如:

sh -x your_script.sh 2> debug_info.txt

如果您想将 的stderr输出与set -x正常输出区分开来,您可以利用输出前缀为stderr的事实,默认为。set -x$PS4+

bash -x your_script.bash 2> \
\
    >(tee >/dev/null \
           >(grep    '^\+ ' > set_x_output.txt)\
           >(grep -v '^\+ ' > rest_of_sdterr.txt)\
      )          

如果您的某些正常stderr输出以 开头+,您可以通过更改来更改默认前缀PS4

答案3

我已经设法用这个命令修复我的重定向:

  • 它还让我能够精确控制要排除的内容。
  • 这仅适用于 4.1 之前的 bash 版本,其中 BASH_XTRACEFD 无效。

exec 2> >(tee -a $LOG_FULL_NAME 2>&1 | grep -v "^+ \|^++ ") 1>&2

相关内容