一. 前言
我们之所以要进行Shell脚本调试,就是为了发现引发脚本错误的原因以及在脚本源代码中定位发生错误的行,常用的手段包括分析输出的错误信息,在脚本中加入调试语句,输出调试信息来辅助诊断错误,利用调试工具等。但与其它高级语言(java,c++等)相比,shell解释器缺乏相应的调试机制和调试工具的支持,其输出的错误信息又往往很不明确,初学者在调试脚本时,除了知道用echo语句输出一些信息外,别无它法,而仅仅依赖于大量的加入echo语句来诊断错误,确实令人不胜其繁,故常见初学者抱怨shell脚本太难调试了。
现在我们系统地学习一些重要的shell脚本调试技术,相信对很多shell的初学者有很大帮助的。
阅读下面内容前,要求读者具有基本的shell编程知识。本文实验平台是Bash3.1+Redhat Enterprise Server 4.0,但所介绍的调试技巧应该也同样适用于其它shell和Unix平台。
二. 在shell脚本中输出调试信息
通过在程序中加入调试语句把一些关键地方或出错的地方的相关信息显示出来。
Shell程序员通常使用echo(ksh程序员常使用print)语句输出信息,但仅仅依靠echo语句的输出跟踪信息太麻烦,调试阶段在脚本中加入的大量的echo语句在产品成形时还得再一一删除掉。这样,这里来说下如何方便有效的输出调试信息。
1. 使用trap命令
trap命令用于捕获指定的信号并执行预定义的命令。其基本的语法是:
trap 'command' signal
其中signal是要捕获的信号,command是捕获到指定的信号之后,所要执行的命令。
我们可以用kill –l命令看到系统中全部可用的信号名,捕获信号后所执行的命令可以是任何一条或多条合法的shell语句,也可以是一个函数名。shell脚本在执行时,会产生三个所谓的“伪信号”(之所以称之为“伪信号”是因为这三个信号是由shell产生的,而其它的信号是由操作系统产生的),通过使用trap命令捕获这三个“伪信号”并输出相关信息对调试非常有帮助。
表 1. shell伪信号
信号名 何时产生
EXIT 从一个函数中退出或整个脚本执行完毕
ERR 当一条命令返回非零状态时(代表命令执行不成功)
DEBUG 脚本中每一条命令执行之前
通过捕获EXIT信号,我们可以在shell脚本中止执行或从函数中退出时,输出某些想要跟踪的变量的值,并由此来判断脚本的执行状态以及出错原因,其使用方法是:
