bash脚本调试

前言

Bash脚本是Linux操作系统的默认脚本语⾔言,既然是编程,调试是必不可少的。用echo输出关键信息是最常⽤用的调试⼿手段。不过当Bash脚本越来越复杂,这种调试⽅式就显得捉襟见肘了。因此本⽂归纳了⼏种常见的Bash脚本调试技巧。

静态调试——打印出执行过程

执行脚本时使用bash 参数的“-­‐x”打开跟踪调试

看下⾯面的⼀段脚本test.sh:

#!/bin/bash
echo "Hello $USER,"
echo "Today is $(date +'%Y-%m-%d')"

当我们以root⽤用户执⾏行./test.sh,打印输出:

Hello root
Today is 2014-09-01

执⾏行bash -x test.sh,输出为:

+ echo 'Hello root' <--当前执⾏行的命令,前⾯面有⼀一个+号
Hello root <--输出结果,前⾯面没有+号
++ date +%Y-%m-%d <--这⾥里是⼀一个调⽤用,因此前⾯面多了⼀一个+号
+ echo 'Today is 2014-09-01'
Today is 2014-09-01

我们可以看到每⼀⾏执⾏的指令都被打印出来,这样我们能跟踪整个脚本的执⾏过程。其中⼀个‘+’表⽰正在执⾏的命令,如果是调⽤的话,每层‘+’表⽰示更深一层的调⽤。

使用“set -x”在脚本中控制打开或关闭跟踪输出

如果我们的脚本有⼏百⾏,⽤“-x”选项打印出太多信息,这时我们就需要使⽤“set -x”打开部分代码的跟踪输出。

下⾯面我们修改test.sh 的代码

#!/bin/bash
echo "Hello $USER"
set -x <--打开跟踪调试
echo "Today is $(date +'%Y-%m-%d')"
set +x <--关闭跟踪调试

下面是输出结果:

Hello kun
++ date +%Y-%m-%d
+ echo 'Today is 2014-09-01'
Today is 2014-09-01
+ set +x

这样我们可以看到只有第⼆个echo 语句的跟踪调试被打开了。

在代码中输出日志

当代码复杂到⼀定程度后,我们应该考虑提供⽇志输出的能力,这种调试⽅法应该是最简单的,直接将我们感兴趣的信息输出出来。我们可以使⽤用⼀个环境变量管理log 输出:

[ -n "$_DEBUG" ] && echo “log...”

这样在脚本调⽤时我们只是在_DEBUG 变量⾮空的时候输出log,我们可以通过下⾯的命令打开debug 输出:

$ _DEBUG=1 ./test.sh

这个命令只会在test.sh 脚本中定义_DEBUG 变量,脚本执⾏结束后_DEBUG 就恢复成未定义状态。

单步调试bashdb

bashdb 调试功能很强⼤,操作类似于GDB,代码托管在sourceforge,
在⽹站上有详细的使⽤文档。使⽤bashdb 可以对shell 脚本的断点设置,单步执⾏,变量观察等许多功能。

下⾯面列出来使⽤bashdb 进⾏行debug 的常⽤命令。

列出代码和查询代码类:

l 列出当前⾏行以下的10 ⾏
- 列出正在执⾏的代码⾏行的前⾯面10 ⾏行
. 回到正在执⾏的代码⾏行
w 列出正在执⾏的代码⾏前后的代码
/pat/ 向后搜索patent

Debug 控制类:

h 帮助
help 命令 得到命令的具体信息
q 退出bashdb
x 算数表达式 计算算数表达式的值,并显⽰示出来
!![空格]Shell 命令 参数 执⾏行shell 命令

控制脚本执⾏行类:

n 执⾏行下⼀条语句,遇到函数,不进⼊函数⾥面执⾏,将函数当作⿊盒
s n 单步执⾏n 次,遇到函数进⼊函数⾥面
b ⾏号n 在⾏号n 处设置断点
del ⾏号n 撤销⾏号n 处的断点
c ⾏号n ⼀直执⾏到⾏号n 处
R 重新启动
Finish 执⾏到程序最后
cond n expr 条件断点

你可能感兴趣的:(bash)