-Shell调试技术总结
学习没种语言都会在编写程序中遇到错误,当然shell也不例外。Shell脚本的错误主要可分为两类:第一类是shell脚本中的语法错误,脚本无法执行到底,第二类是shell脚本能够执行完毕,但并不能按照我们预期的结果那样,也就是存在逻辑错误。
第一类错误主要包括漏掉关键字、漏掉引号、空格符该有而未有、变量大小写没去分等。这一类错误一般通过自己的仔细检查都能够检查出来,关键是第二种错误。
在逻辑错误中Shell有几种调试方法。常见的Shell调试方法有trap、tee、调试钩子和Shell选项。
(一)trap是Linux的内建命令,不要用于捕捉信号,trap命令可以指定收集某种信号所执行的命令,基本形式为:
trap command sign1 sign2 、、、signN
对于上述命令的解释为当trap收到sign1 sign2 、、、signN 中的任意一个信号时就执行command命令,当command命令执行完后脚本继续收到信号进行操作,直到脚本执行结束。
Shell脚本在执行时,会产生三个“伪信号”(原因是这三个信号是有Shell产生的,而其他信号是由操作系统产生的),利用trap命令可以捕捉到这三个“伪信号”并输出相关信息是Shell调试的一种重要技巧。三种“伪信号”分别为EXIT、ERR和DEBUG。
Shell伪信号即产生的条件
信号名称 |
产生条件 |
EXIT |
从函数中推出,或从整个脚本中退出 |
ERR |
当一条命令返回非零状态码,即命令执行不成功 |
DEBUG |
脚本中的每条命令执行之前 |
举例:
这个脚本先执行fun函数然后trap捕捉到EXIT信号后的输出,而EXIT信号是在fun函数执行完毕才产生的。
执行该脚本后先执行函数fun,该函数返回1,非零返回值的函数被认为是异常信号,然后trap捕捉到ERR信号然后输出行号和var的值,然后执行ipconfig,ipconfig不存在返回1,因此产生ERR信号故输出如上结果。
在此脚本中先执行trap先DEBUG然后接着不断的进行跟踪,通过上面运算可以分析到整个脚本的执行踪迹,能够判断吃哪些条件执行了哪些条件没有执行。
trap命令通过捕捉三个“伪信号”能够方便的跟踪异常函数和信号,尽管echo也能实现,但是用trap更加高效、简洁。
(二)用tee命令进行Shell调试。tee命令产生的数据流分为两个,其中将一个输出到标准输出,一个到输出文件。利用tee的这种特性就可以逐步检查各条命令的执行结果来定位错误。tee还有一个选项-a,表示将Shell命令的输出追加到某文件的末尾。
先将who执行的结果从管道传给tee,tee命令将标准输出复制到文件output。因此仍然输出who命令标准输出。
将执行结果追加到output文件后边。
该脚本中先找出ifcfg-eth0文件内容,然后在dubug.txt后边追加IPADDR内容,最后追加ip地址,从debug.txt可以清晰看出数据的流向。便于发现脚本中存在的逻辑错误。