首页 理论教育 实用LinuxShell编程-Bash调试技巧

实用LinuxShell编程-Bash调试技巧

时间:2023-11-18 理论教育 版权反馈
【摘要】:Bash有一定的调试功能。命令set和shopt有几个选项具有调试作用。例如,显示一个未定义的y时,得到的是空行,不算是错误:表10-2中的选项nounset打开后,Bash不允许引用未定义的变量,否则会提示出错。读者还可以安装bashdb—专用于Bash脚本的调试工具。关于Bash调试的内容很丰富,并非只有本节所介绍的这些,这里再提几句。

实用LinuxShell编程-Bash调试技巧

Bash有一定的调试功能。命令set和shopt有几个选项具有调试作用。

Bash默认可以引用一个未定义的变量。例如,显示一个未定义的y时,得到的是空行,不算是错误

978-7-111-48202-4-Chapter10-87.jpg

表10-2中的选项nounset打开后,Bash不允许引用未定义的变量,否则会提示出错。运行set-u或set-onounset打开这个选项后,再试着显示未定义的变量y:

978-7-111-48202-4-Chapter10-88.jpg

如果一个Bash脚本能像其他高级语言那样,必须先定义变量才能引用变量,那么这个脚本会相对严谨一些,为脚本的调试打下一个良好的基础。

一个脚本内命令shift的左移参数的次数超过参数个数时,默认脚本运行不会出错。当表10-3中的选项shift_verbose打开,并且shift的移动参数次数超过参数个数时,运行脚本会遇到出现错误的提示。所以,在使用shift命令较多的脚本里,打开选项shift_verbose,会使脚本编写得更严谨一些。

一个脚本通常是由多条命令组成的,表10-2中的选项xtrace打开后,脚本中的每一条命令及其参数都看得到,如有循环,每次循环的情况也都看得一清二楚。

脚本debug_1.sh中的“while:”循环本身是无穷循环,因为空命令“:”总是成功。每次循环,a的值增长1,当a>=5时,执行命令break,循环退出。

978-7-111-48202-4-Chapter10-89.jpg

执行脚本debug_1.sh将没有任何输出,只能脑子里想象着5次while循环的情况。如果在脚本的第二行增加命令set-x或者set-oxtrace,脚本是怎么运行的就看得一清二楚。

978-7-111-48202-4-Chapter10-90.jpg

运行debug_2.sh,每轮循环中的空命令“:”、中括号判断命令、赋值命令,和最后退出时的break命令都显示出来:

978-7-111-48202-4-Chapter10-91.jpg

选项verbose打开后,一个脚本中的每条命令在执行之前会先原样显示出来。下面的脚本中有命令set-xv将选项xtrace和verbose同时打开:

978-7-111-48202-4-Chapter10-92.jpg

运行该脚本,可以理解选项verbose的作用:

978-7-111-48202-4-Chapter10-93.jpg

978-7-111-48202-4-Chapter10-94.jpg

参数换为Sunday,再运行一次:

978-7-111-48202-4-Chapter10-95.jpg(www.xing528.com)

当运行set-x之后,脚本一运行会看见很多+,这是为什么呢?它是表4-3中的PS4的值,PS4的默认值为+,查看一下:

978-7-111-48202-4-Chapter10-96.jpg

像PS1、PS2和PS3一样,PS4的值也是可以设置的。

脚本debug_PS4.sh的作用是:读入用户输入的名字,然后将当前目录下的名字以.txt结尾的文件移到临时文件夹里面。

978-7-111-48202-4-Chapter10-97.jpg

查看一下当前目录下的.txt文件,假设有如下几个文件:

978-7-111-48202-4-Chapter10-98.jpg

重新设置内置变量PS4,其中LINENO也是内置变量,见表4-3,它是脚本中命令所在的行号:

978-7-111-48202-4-Chapter10-99.jpg

运行脚本debug_PS4.sh,键盘输入名字Mike:

978-7-111-48202-4-Chapter10-100.jpg

978-7-111-48202-4-Chapter10-101.jpg

从上面的输入可以发现脚本的一个小缺陷,就是命令mkdir-p应该放到for循环的上面,否则该命令会运行多次(重复创建同一个目录),这没必要,运行一次就行。

如果将脚本debug_PS4.sh中的命令set-x删除,运行命令bash-xdebug_PS4.sh,效果是一样的。即,运行命令bash-x<脚本>,相当于在脚本中加了set-x。

还有一种“省略”set-x的方法,把脚本debug_PS4.sh的第一行改为#!/bin/bash-x,第二行的命令set-x就可以去除了。

有的时候,一个脚本特别长,而只需要对它的一部分进行调试,那么在需要调试的部分的前面加上命令set-x(打开选项xtrace),后面加上命令set+x(关闭选项xtrace)即可:

978-7-111-48202-4-Chapter10-102.jpg

除了LINENO之外,还有BASH_SOURCE、BASH_SUBSHELL和FUNCNAME等内置变量也可以用于脚本的调试。读者还可以安装bashdb—专用于Bash脚本的调试工具。它有很强大的功能,如,设置断点、单步跟踪执行、变量观察等。

关于Bash调试的内容很丰富,并非只有本节所介绍的这些,这里再提几句。可以利用命令trap来调试,还可以在脚本中多增加打印命令,利用输出重定向来获取log(脚本日志),通过看log来分析脚本的运行情况。还可以在脚本中增加“调试块”,当变量DEBUG声明之后,脚本能够打印调试信息。

978-7-111-48202-4-Chapter10-103.jpg

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈