set -x 是 bash 调试核心机制,启用后以“+”前缀打印展开后的实际执行命令;支持脚本内开关、运行时启用、子 shell 隔离及与 -e/-v 组合使用。

set -x 是 Bash 中最直接的脚本调试方式,它会让 Shell 在执行每条命令前,先把它(含展开后的变量、通配符等)打印到标准错误(stderr),方便你看到“实际运行的是什么”。
开启和关闭调试模式
在脚本中插入以下任意一种写法即可启用追踪:
-
set -x或set -o xtrace—— 开启调试 -
set +x或set +o xtrace—— 关闭调试(推荐成对使用,避免全程输出干扰)
也可以在运行时临时启用:bash -x ./myscript.sh,适合快速验证,无需修改脚本。
理解 -x 的输出格式
启用后,每行命令会以 + 开头,例如:
+ echo hello $USER + ls /tmp/*.log
注意:变量已被展开(如 $USER 变成 alice),通配符也已匹配(/tmp/*.log 可能变成 /tmp/a.log /tmp/b.log)。这正是它比单纯加 echo 更可靠的原因——看到的就是 Shell 真正执行的内容。
精准控制调试范围
不必整个脚本都开启 set -x。常见做法是只包裹可疑段落:
- 调试函数内部:
set -x; some_command; set +x - 用子 shell 隔离:
(set -x; ls -l "$DIR")—— 括号内开启,退出自动关闭 - 结合条件启用:
[[ "$DEBUG" ]] && set -x,通过环境变量控制是否开启
配合其他选项提升可读性
单独用 set -x 有时输出太密集。可以组合使用:
-
set -xe:开启调试 + 遇错立即退出(-e),避免错误被忽略 -
set -xv:同时显示原始代码(-v,未展开)和展开后执行内容(-x),适合查变量引用问题 - 重定向调试输出:
set -x 2>debug.log,把追踪日志单独保存,不污染终端











