bash -x是最直接有效的调试方式,它逐行打印执行前的命令及变量展开结果,+号开头显示实际执行内容,配合set -x/set +x可局部启用、PS4可添加行号等信息,精准定位跳过、空变量、参数错误等问题。

用 bash -x 运行脚本,是最直接有效的调试方式——它会逐行打印执行前的命令(含变量展开结果),帮你一眼看清哪里没执行、变量为何为空、条件为何不成立。
理解 -x 的输出含义
bash -x(或脚本首行写 #!/bin/bash -x)会在每条命令实际运行前,先以 + 开头打印出“展开后”的命令。例如:
原始代码:
name="Alice" echo "Hello $name"
-x 输出:
+ name=Alice + echo 'Hello Alice'
注意单引号包裹、空格保留、变量已替换——这正是判断逻辑是否符合预期的关键依据。
配合 set 命令动态控制调试范围
不必全程开启 -x,可在关键段落精准启用/关闭:
-
set -x:开启调试输出 -
set +x:关闭调试输出 -
set -o xtrace和set +o xtrace是等效写法
适合只追踪函数内部、循环体或某段 if 分支,避免被无关日志淹没。
定位常见问题的典型线索
观察 -x 输出时,重点关注以下信号:
- 某行命令完全没出现 → 可能被前面的
exit、return或未满足的if条件跳过了 - 变量显示为空(如
+ echo '')→ 检查赋值语句是否执行、是否拼错变量名、是否在子 shell 中修改未导出 - 路径或参数带多余空格(如
+ cp /src /dst /target)→ 实际传了三个参数,可能因未加引号导致 word splitting - 命令返回非零但没报错 →
-x不显示退出码,需搭配set -e或手动检查$?
提升可读性的实用技巧
默认输出容易滚动过快,可通过组合方式增强实用性:
- 重定向到文件:
bash -x script.sh > debug.log 2>&1,方便反复查看 - 高亮关键行:
bash -x script.sh 2>&1 | grep --color=always -E '^+|ERROR|WARNING' - 结合 PS4 自定义提示符:
PS4='+[$LINENO] ' bash -x script.sh,每行开头显示行号,快速定位源码位置


















