🔧 一、基础调试方法:追踪命令执行

  1. -x 选项(Xtrace 模式)

    • 作用:逐行打印执行前的命令(变量已展开),显示实际执行的指令。
    • 启用方式
      bash -x script.sh      # 命令行启用
      
      或在脚本内局部启用:
      #!/bin/bash
      set -x                 # 开启调试
      echo "调试区域"
      set +x                 # 关闭调试
      
    • 输出示例
      + echo 'Hello World'
      Hello World
      
  2. -v 选项(Verbose 模式)

    • 作用:打印原始命令(未展开变量),与 -x 结合使用更全面:
      bash -vx script.sh    # 同时显示原始命令和执行结果
      

二、增强调试技巧

  1. 自定义调试信息格式(PS4 变量)

    • 默认输出为 +,可改为包含文件名、行号、函数名等:
      export PS4='+ [${BASH_SOURCE}:${LINENO} in ${FUNCNAME[0]}]: '
      set -x
      
      输出示例
      + [script.sh:10 in main]: echo "调试中"
      
  2. 重定向调试日志到文件
    避免终端输出混乱,将追踪信息写入文件:

    exec 5> debug.log        # 创建文件描述符5指向日志文件
    BASH_XTRACEFD="5"        # 指定调试输出到描述符5
    set -x
    
  3. 局部调试(子Shell隔离)
    仅调试脚本片段,避免全局干扰:

    ( set -x; command1; command2 )  # 子Shell内启用调试
    

🛡️ 三、严格模式(预防性调试)

组合选项提升脚本健壮性,提前暴露问题:

set -euxo pipefail
  • -e:命令失败时立即退出脚本。
  • -u:使用未定义变量时报错(防止空变量)。
  • -o pipefail:管道中任意命令失败则整个管道失败。

适用于生产环境脚本,避免隐藏错误。


🐞 四、高级调试工具

  1. 静态检查工具 shellcheck
    提前检测语法和潜在问题:
    shellcheck script.sh    # 输出警告和建议
    

💎 调试模式最佳实践

  1. 渐进定位:先用 -x 定位大致范围,再结合 PS4 精细化调试。
  2. 错误捕获:使用 trap '错误处理命令' ERR 拦截错误并输出上下文。
  3. 日志分级:区分调试日志(>&2 输出到标准错误)和正常输出。
  4. 生产环境:调试后务必关闭调试模式(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 脚本问题。简单调试用 -xset,复杂场景用 bashdb,预防错误用严格模式组合。