BASH的调试手段
回波/打印(普通技)
打印一些变量,或者提示信息。这应该是一个通用的方法了。在BASH里,我们可以简单的用呼应,或者打印来输出一些日志,或者加一些loglevel来过滤一些日志。这里贴一下我平常用的函数:
_loglevel=2
死(){
,,回声“关键:1美元比;”祝辞,2
,,退出1
}
INFO () {
,,(美元_loglevel通用电气2],,回声”信息:1美元比;“祝辞,2
}
错误(){
,,(美元_loglevel通用电气1],,回声”错误:1美元比;“祝辞,2
}
这里的实现只是简单的加了一个loglevel,其实可以把日志输出到一个文件中,或者给日志加上颜色。比如:
#添加颜色(美元_loglevel通用电气1],,echo - e”\ [31 m错误:033 \ 033 [0 m 1美元比;”祝辞,2
#重定向到文件
[$ _loglevel通用电气1],,回声”错误:1美元比;“比;/var/log/xxx_log.美元BASHPID
设置- x(稀有技)
- x (xtrace)选项会导致BASH在执行命令之前,先把要执行的命令打印出来。这个选项对调试一些命令错误很有帮助。
有的时候,由于传进来的参数带有一些特殊字符,导致BASH解析时不是按照我们预想的进行。这个时候,把- x打开,就能在命令执行前,把扩展后的命令打印出来,比如基于前面写的函数:
设置- x
信息“这是一个信息log>”
错误”这是一个错误log>”
设置+ x
如果想全程打开xtrace,可以在执行脚本的时候加- x参数。
陷阱/bashdb(史诗技)
为了方便调试,BASH也提供了陷阱机制。这跟之前介绍的两种方法高级不少。我们可以利用陷阱这个内置命令来指定各个sigspec应该执行的命令.trap的具体用法如下:
[lp] [[arg] sigspec陷阱……)
sigspec包括中定义的各个信号,退出,呃,恢复和调试。
各个信号这里就不介绍了.EXIT会在壳退出时执行指定的命令。若当前壳中有命令执行返回非零值,则会执行与错相关联的命令。而返回是针对源和,每次执行都会触发返回陷阱。若绑定一个命令到调试,则会在每一个命令执行之前,都会先执行调试这个陷阱。这里要注意的是,错误和调试只在当前壳有效。若想函数和子壳自动继承这些陷阱,则可以设置- t(调试/返回)和e (ERR)。
比如,下面的脚本会在退出时,执行回声:
# !/bin/bash
陷阱”呼应,这是一个退出echo>”退出
回声”这是一个正常的echo>“
或者,让脚本中命令出错时,把相应的命令打印出来:
# !/bin/bash
陷阱的echo $ BASH_COMMAND返回犯错犯错
呼应这是一个正常的测试
UnknownCmd
亦或者,让脚本的命令单步执行:
# !/bin/bash
陷阱”(读- p”(0: LINENO美元)$ BASH_COMMAND ?祝辞”)的调试
呼应,这是一个测试
i=0
,(真正的)
,做,echo $ i
,,(+ +)
完成