当在 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