如何让exec调用的bar.bash也进入bash调试模式?
让
bar.bash随foo.bash一起进入调试模式的几种方法 当你用bash -x foo.bash启动调试时,exec bar.bash会替换当前的shell进程,但原进程的-x调试选项不会自动传递给新启动的bar.bash——因为exec只是替换进程镜像,不会继承父shell的调试标记。下面是几种解决办法,按推荐程度排序:
方法1:直接修改foo.bash中的exec命令
这是最直接的方案,如果你有权限修改foo.bash,把原来的:
exec bar.bash
改成:
exec bash -x bar.bash
这样bar.bash会被带-x参数的bash解释器执行,直接进入调试模式。
方法2:让foo.bash自动适配调试状态
如果你希望bar.bash的调试状态和foo.bash保持一致(即foo.bash调试时它也调试,否则正常运行),可以修改foo.bash的exec逻辑:
# 检查当前shell是否开启了xtrace(-x调试模式) if [[ $- == *x* ]]; then exec bash -x bar.bash else exec bar.bash fi
这里$-变量包含当前shell的选项标记,*x*表示存在x(调试)选项。这样不管你怎么启动foo.bash,bar.bash都会自动匹配调试状态。
方法3:不修改脚本,用环境变量临时开启调试
如果你没法修改foo.bash,可以利用bash的BASH_ENV环境变量:
- 先创建一个临时脚本(比如
debug_xtrace.sh),内容只有一行:
set -x
- 然后用这个环境变量启动
foo.bash:
BASH_ENV=./debug_xtrace.sh bash -x foo.bash
原理是:bash启动非交互式shell时(比如执行bar.bash这种脚本),会自动执行BASH_ENV指定的文件。这样bar.bash启动前会先执行set -x,开启调试模式。
注意:这个方法会影响所有在本次会话中启动的非交互式bash脚本,所以只适合临时调试使用,调试完记得取消这个环境变量。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

