set -x 是 Bash 中最直接的脚本执行跟踪方式,它会在每条命令执行前将其展开后的形式打印到 stderr;开启用 set -x,关闭用 set +x,可全局或局部启用,配合 -e、-u 及 PS4 等可提升调试效率。

set -x 是 Bash 中最直接的脚本执行跟踪方式,它会让 Shell 在运行每条命令前,先将该命令(含展开后的变量、通配符等)打印到标准错误输出(stderr),便于你实时看清“实际执行了什么”。
开启和关闭跟踪
在脚本中插入 set -x 即可开启跟踪;用 set +x 可关闭。两者都只影响其后执行的命令:
- 放在脚本开头,整个脚本都会被跟踪
- 只在关键代码段前后加 set -x 和 set +x,可缩小输出范围,避免信息过载
- 也可以在终端中临时启用:bash -x ./script.sh,无需修改脚本
理解输出格式
开启 set -x 后,每行命令前会显示一个带 + 号的提示,例如:
+ echo 'Hello'
Hello
+ ls /tmp/*.log
/tmp/access.log /tmp/error.log
注意:+ 行是 Shell 解析并准备执行的命令(已做变量替换、路径展开等),下一行才是该命令的实际输出。这对排查“为什么变量没生效”或“通配符没匹配到文件”特别有用。
配合其他选项提升调试效率
- set -e:遇到非零退出状态立即退出,防止错误被忽略(常与 -x 搭配使用)
- set -u:访问未定义变量时报错,避免静默失败
- 重定向跟踪输出:bash -x ./script.sh 2> trace.log,把调试信息单独保存,不干扰正常输出
- 用 PS4 自定义提示符,比如 PS4='+[$LINENO] ',让每行带上行号,方便定位
注意事项
跟踪输出默认写入 stderr,不影响脚本 stdout 的逻辑,但大量输出可能掩盖真正需要的日志。生产环境切勿长期开启。调试完成后记得删掉 set -x 或确保它被 set +x 明确关闭。对敏感信息(如密码、token),要避免在 set -x 下暴露——可临时用 set +x 包裹相关语句。


















