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

shell的调试方法

2016-01-18 21:36 260 查看
shell调试有以下几种方法

一、在脚本中输出调试的信息:使用echo、trap

1、trap命令用于捕获指定的信号并执行预定义的命令。其中signal是要捕获的信号,command是捕获到指定的信号之后,所要执行的命令。

shell脚本在执行时,会产生三个所谓的“伪信号”,(之所以称之为“伪信号”是因为这三个信号是由shell产生的,而其它的信号是由操作系统产生的),通过使用trap命令捕获这三个“伪信号”并输出相关信息对调试非常有帮助。

信号名何时产生
EXIT从一个函数中退出或整个脚本执行完毕
ERR当一条命令返回非零状态时(代表命令执行不成功)
DEBUG脚本中每一条命令执行之前
1.1、通过捕获EXIT信号,我们可以方便的追踪执行退出的命令或者函数。





1.2、通过捕获ERR信号,我们可以方便的追踪执行不成功的命令或函数





1.3、通过捕获DEBUG信号,我们只需要一条trap语句就可以完成对相关变量的全程跟踪。






2. 使用tee命令

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


3. 使用"调试钩子"

通过定义一个DEBUG函数可以使植入调试钩子的过程更简洁方便。

先执行export
DEBUG=true命令打开调试钩子。





二、使用shell的选项

-n 只读取shell脚本,但不实际执行

-x 进入跟踪方式,显示所执行的每一条命令

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

“-n”可用于测试shell脚本是否存在语法错误,但不会实际执行命令。在shell脚本编写完成之后,实际执行之前,首先使用“-n”选项来测试脚本是否存在语法错误是一个很好的习惯。因为某些shell脚本在执行时会对系统环境产生影响,比如生成或移动文件等,如果在实际执行才发现语法错误,您不得不手工做一些系统环境的恢复工作才能继续测试这个脚本。

“-c”选项使shell解释器从一个字符串中而不是从一个文件中读取并执行shell命令。当需要临时测试一小段脚本的执行结果时,可以使用这个选项,如下所示:

sh -c 'a=1;b=2;let c=$a+$b;echo "c=$c"'

"-x"选项可用来跟踪脚本的执行,是调试shell脚本的强有力工具。“-x”选项使shell在执行脚本的过程中把它实际执行的每一个命令行显示出来,并且在行首显示一个"+"号。 "+"号后面显示的是经过了变量替换之后的命令行的内容,有助于分析实际执行的是什么命令。 “-x”选项使用起来简单方便,可以轻松对付大多数的shell调试任务,应把其当作首选的调试手段。

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




三. 对"-x"选项的增强

$LINENO:代表shell脚本的当前行号。

$FUNCNAME:函数的名字,它是一个数组变量,其中包含了整个调用链上所有的函数的名字,故变量${FUNCNAME[0]}代表shell脚本当前正在执行的函数的名字,而变量${FUNCNAME[1]}则代表调用函数${FUNCNAME[0]}的函数的名字,余者可以依此类推。

$PS4:主提示符变量$PS1和第二级提示符变量$PS2比较常见,但很少有人注意到第四级提示符变量$PS4的作用。我们知道使用“-x”执行选项将会显示shell脚本中每一条实际执行过的命令,而$PS4的值将被显示在“-x”选项输出的每一条命令的前面。在Bash Shell中,缺省的$PS4的值是"+"号。(现在知道为什么使用"-x"选项时,输出的命令前面有一个"+"号了吧?)。

利用$PS4这一特性,通过使用一些内置变量来重定义$PS4的值,我们就可以增强"-x"选项的输出信息。例如先执行export PS4='+{$LINENO:${FUNCNAME[0]}} ', 然后再使用“-x”选项来执行脚本,就能在每一条实际执行的命令前面显示其行号以及所属的函数名。





shell中还有其它一些对调试有帮助的内置变量,比如在Bash Shell中还有BASH_SOURCE,
BASH_SUBSHELL等一批对调试有帮助的内置变量,您可以通过man sh或man bash来查看,然后根据您的调试目的,使用这些内置变量来定制$PS4,从而达到增强“-x”选项的输出信息的目的。

参考文章:http://www.ibm.com/developerworks/cn/linux/l-cn-shell-debug/index.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: