🔧 一、基础调试方法:追踪命令执行
-
-x选项(Xtrace 模式)- 作用:逐行打印执行前的命令(变量已展开),显示实际执行的指令。
- 启用方式:
或在脚本内局部启用:bash -x script.sh # 命令行启用#!/bin/bash set -x # 开启调试 echo "调试区域" set +x # 关闭调试 - 输出示例:
+ echo 'Hello World' Hello World
-
-v选项(Verbose 模式)- 作用:打印原始命令(未展开变量),与
-x结合使用更全面:bash -vx script.sh # 同时显示原始命令和执行结果
- 作用:打印原始命令(未展开变量),与
⚡ 二、增强调试技巧
-
自定义调试信息格式(
PS4变量)- 默认输出为
+,可改为包含文件名、行号、函数名等:
输出示例:export PS4='+ [${BASH_SOURCE}:${LINENO} in ${FUNCNAME[0]}]: ' set -x+ [script.sh:10 in main]: echo "调试中"
- 默认输出为
-
重定向调试日志到文件
避免终端输出混乱,将追踪信息写入文件:exec 5> debug.log # 创建文件描述符5指向日志文件 BASH_XTRACEFD="5" # 指定调试输出到描述符5 set -x -
局部调试(子Shell隔离)
仅调试脚本片段,避免全局干扰:( set -x; command1; command2 ) # 子Shell内启用调试
🛡️ 三、严格模式(预防性调试)
组合选项提升脚本健壮性,提前暴露问题:
set -euxo pipefail
-e:命令失败时立即退出脚本。-u:使用未定义变量时报错(防止空变量)。-o pipefail:管道中任意命令失败则整个管道失败。
适用于生产环境脚本,避免隐藏错误。
🐞 四、高级调试工具
- 静态检查工具
shellcheck
提前检测语法和潜在问题:shellcheck script.sh # 输出警告和建议
💎 调试模式最佳实践
- 渐进定位:先用
-x定位大致范围,再结合PS4精细化调试。 - 错误捕获:使用
trap '错误处理命令' ERR拦截错误并输出上下文。 - 日志分级:区分调试日志(
>&2输出到标准错误)和正常输出。 - 生产环境:调试后务必关闭调试模式(
set +x),避免泄露敏感信息。
示例:调试一个数据处理函数
#!/bin/bash set -euo pipefail PS4='+ [${LINENO}]: ' # 显示行号 process_data() { set -x [ ! -f "$1" ] && echo "文件不存在" >&2 # ... 处理逻辑 set +x } trap 'echo "错误发生在行 $LINENO" >&2' ERR process_data "input.txt"
掌握这些技巧,可快速解决大部分 Bash 脚本问题。简单调试用 -x 和 set,复杂场景用 bashdb,预防错误用严格模式组合。