1.10 调试脚本
调试功能是每一种编程语言都应该实现的重要特性之一,当出现一些始料未及的情况时,用它来生成脚本运行信息。调试信息可以帮你弄清楚是什么原因使得程序发生崩溃或行为异常。每位系统程序员都应该了解Bash提供的那些调试选项,另外还需要了解一些调试技巧。
1.10.1 预备知识
调试shell脚本不需要什么特殊工具。Bash本身就包含了一些选项,能够打印出脚本接受的参数和输入。让我们来看看该怎么做。
1.10.2 实战演练
使用选项 -x
,启动跟踪调试shell脚本:
- $ bash -x script.sh
运行带有-x
标志的脚本能打印出所执行的每一行命令以及当前状态。注意,你也可以使用sh -x script
。
-x
标识将脚本中执行过的每一行都输出到stdout
。不过,我们也可以要求只关注脚本某些部分的命令及参数的打印输出。针对这种情况,可以在脚本中使用set built-in
来启用或禁止调试打印。
set -x
: 在执行时显示参数和命令。set +x
: 禁止调试。set -v
: 当命令进行读取时显示输入。set +v
: 禁止打印输入。
例如:
#!/bin/bash
#文件名: debug.sh
for i in {1..6}
do
set -x
echo $i
set +x
done
echo "Script executed"
在上面的脚本中,仅在 -x
和 +x
所限制的区域内,echo $i
的调试信息才会被打印出来。
这种调试方法是由Bash的内建功能提供的。它们通常以固定的格式生成调试信息。但是在很多情况下,我们需要以自定义格式显示调试信息。这可以通过传递 _DEBUG
环境变量来建立这类调试风格。
请看下面的代码:
#!/bin/bash
function DEBUG()
{
[ "$_DEBUG" == "on" ] && $@ || :
}
for i in {1..10}
do
DEBUG echo $i
done
可以将调试功能置为"on"
来运行上面的脚本:
- $ _DEBUG=on ./script.sh
我们在每一个需要打印调试信息的语句前加上DEBUG
。如果没有把 _DEBUG=on
传递给脚本,那么调试信息就不会打印出来。在Bash中,命令 ':'
告诉shell不要进行任何操作。
1.10.3 补充内容
还有其他脚本调试的便捷方法,我们甚至可以巧妙地利用shebang来进行调试。
shebang的妙用
把shebang从 #!/bin/bash
改成 #!/bin/bash -xv
,这样一来,不用任何其他选项就可以启用调试功能了。