1.10 调试脚本

调试功能是每一种编程语言都应该实现的重要特性之一,当出现一些始料未及的情况时,用它来生成脚本运行信息。调试信息可以帮你弄清楚是什么原因使得程序发生崩溃或行为异常。每位系统程序员都应该了解Bash提供的那些调试选项,另外还需要了解一些调试技巧。

1.10.1 预备知识

调试shell脚本不需要什么特殊工具。Bash本身就包含了一些选项,能够打印出脚本接受的参数和输入。让我们来看看该怎么做。

1.10.2 实战演练

使用选项 -x,启动跟踪调试shell脚本:

  1. $ bash -x script.sh

运行带有-x标志的脚本能打印出所执行的每一行命令以及当前状态。注意,你也可以使用sh -x script

-x 标识将脚本中执行过的每一行都输出到stdout。不过,我们也可以要求只关注脚本某些部分的命令及参数的打印输出。针对这种情况,可以在脚本中使用set built-in来启用或禁止调试打印。

  • set -x: 在执行时显示参数和命令。

  • set +x: 禁止调试。

  • set -v: 当命令进行读取时显示输入。

  • set +v: 禁止打印输入。

例如:

  1. #!/bin/bash
  2. #文件名: debug.sh
  3. for i in {1..6}
  4. do
  5. set -x
  6. echo $i
  7. set +x
  8. done
  9. echo "Script executed"

在上面的脚本中,仅在 -x+x 所限制的区域内,echo $i的调试信息才会被打印出来。

这种调试方法是由Bash的内建功能提供的。它们通常以固定的格式生成调试信息。但是在很多情况下,我们需要以自定义格式显示调试信息。这可以通过传递 _DEBUG环境变量来建立这类调试风格。

请看下面的代码:

  1. #!/bin/bash
  2. function DEBUG()
  3. {
  4. [ "$_DEBUG" == "on" ] && $@ || :
  5. }
  6. for i in {1..10}
  7. do
  8. DEBUG echo $i
  9. done

可以将调试功能置为"on"来运行上面的脚本:

  1. $ _DEBUG=on ./script.sh

我们在每一个需要打印调试信息的语句前加上DEBUG。如果没有把 _DEBUG=on传递给脚本,那么调试信息就不会打印出来。在Bash中,命令 ':' 告诉shell不要进行任何操作。

1.10.3 补充内容

还有其他脚本调试的便捷方法,我们甚至可以巧妙地利用shebang来进行调试。

shebang的妙用

把shebang从 #!/bin/bash改成 #!/bin/bash -xv,这样一来,不用任何其他选项就可以启用调试功能了。