Debugging Scripts
调试shell脚本通常十分容易,除了没有特定的工具来帮助我们调试。在这一部分我们将快速地概括一下调式脚本的基本方法。
当一个错误发生时,通常shell将打印出错误所在行的行号。如果错误不是可以直接就能找到的话,我们可以添加额外的echo程序语句以显示变量的内容,并且可以简单将代码片段输入到交互式的shell中进行测试。
因为脚本运行通常是被解释运行的,因此修改和重试一个脚本并不会有额外的编译开销。追踪更复杂的错误的主要方法就是设置各式各样的shell选项。而要做到这种要求,你可以在调用shell后使用命令行选项,或者使用set指令。下表总结了所有的选项:
Command Line Option | set Option | Description |
sh -n <script> | set -o noexec set -n | 只检查语法错误而不运行指令 |
sh -v <script> | set -o verbose set -v | 在运行命令前先显示命令 |
sh -x <script> | set -o xtrace set -x | 在命令运行之后再显示命令 |
sh -u <script> | set -o nounset set -u | 当一个未定义的变量被使用时给出错误信息 |
我们可以设置set选项,-o表示打开,+o表示关闭,同样对缩写版本也是一样。我们可以使用xtrace选项进行简单的跟踪执行。作为最初的检查,我们可以使用命令行选项,但要做精细的调式,我们就需要在脚本中有问题的代码周围设置xtrace标志(设置跟踪状态运行与否)。执行跟踪将促使Shell在执行带有变量扩展的Shell脚本中的每一行之前将之打印出来。
使用下面的命令来设置xtrace为开:
set -o xtrace而下面的命令则设置xtrace为关:
set +o xtrace扩展的级别是通过在每一行开始的“+signs”的数量来表示的(默认情况下)。所以我们可以将+改为一些更有意义的内容,方法是在我们的Shell配置文件中设置Shell变量PS4的值。
在Shell中,我们还会发现我们可以在脚本的开始像下面这样设置来跟踪EXIT信号以发现程序是否退出:
trap 'echo Exiting: critical variable = $critical_variable' EXIT