您的位置:首页 > 运维架构 > Shell

shell的调试技术

2016-03-17 17:19 337 查看
shell出错一般有两种情况:语法错误和业务逻辑错误

四种调试方式:trap,tee,调试钩子和shell选项

1.trap命令用于捕获指定的信号并执行预定义的命令。

其基本的语法是:

trap 'command' signal

其中signal是要捕获的信号,command是捕获到指定的信号之后,所要执行的命令。

shell脚本在执行时,会产生三个所谓的“伪信号”。(“伪信号”是因为这三个信号是由shell产生的,而其它的信号是由操作系统产生的)

伪信号  何时产生

EXIT   从一个函数中退出或者整个脚本执行完毕

ERR   当一条命令返回非零状态时(代表命令执行不成功)

DEBUG 脚本中每一条命令执行之前

2.tee命令会从标准输入读取数据,将其内容输出到标准输出设备,同时又可将内容保存成文件。

shell中管道以及输入输出重定向使用得非常多。由于执行管道不会显示在屏幕上,所以一旦语句出错,很难判断是哪一个不出错。此时添加tee命令进行调试,就很可以清晰的看到数据流向。

3.调试钩子

使用DEBUG函数来控制是否要输出调试信息,这样的代码块通常称之为“调试钩子”或“调试块”。

调试钩子内部可以输出任何您想输出的调试信息。

执行export DEBUG=true命令打开调试钩子,使其输出调试信息

4.shell选项:不用修改源代码来调试shell脚本,只要执行脚本时加上选择,即可调试。

shell选项有三个:

-n 只读取shell脚本,但不实际执行(测试shell脚本是否存在语法错误)

-x 进入跟踪方式,显示所执行的每一条命令(跟踪脚本的执行,是调试shell脚本的强有力工具。实际执行的每一个命令行显示出来,行首显示一个"+"号。首选的调试手段)

-c "string" 从strings中读取命令

把本文前面所述的trap ‘command’ DEBUG机制与“-x”选项结合起来,我们就可以既输出实际执行的每一条命令,又逐行跟踪相关变量的值,对调试相当有帮助。

总结

现在调试shell脚本的过程:

首先使用“-n”选项检查语法错误,然后使用“-x”选项跟踪脚本的执行,使用“-x”选项之前,别忘了先定制PS4变量的值来增强“-x”选项的输出信息,至少应该令其输出行号信息(先执行export PS4='+[$LINENO]',更一劳永逸的办法是将这条语句加到您用户主目录的.bash_profile文件中去),这将使你的调试之旅更轻松。也可以利用trap,调试钩子等手段输出关键调试信息,快速缩小排查错误的范围,并在脚本中使用“set -x”及“set +x”对某些代码块进行重点跟踪。

如果脚本足够复杂,还需要更强的调试能力,可以使用shell调试器bashdb,这是一个类似于GDB的调试工具,可以完成对shell脚本的断点设置,单步执行,变量观察等许多功能,使用bashdb对阅读和理解复杂的shell脚本也会大有裨益。关于bashdb的安装和使用,可参http://bashdb.sourceforge.net/上的文档
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: