首页 > 代码库 > 《学习bash》笔记--调试shell程序

《学习bash》笔记--调试shell程序

在shell中,最简单的调试助手时输出语句echo,可以通过把许多echo语句放到代码中进行调试,但必须花费足够的时间以定位

要查看的信息。可能必须通过许多的输出才能发现要查找的信息。

1.set选项

最基本的时set -o命令选项,当运行脚本时,这些选项可以用在命令行上,如下表所示:
set -o选项      命令行选项      行为
noexec            -n                     不运行命令,值检查语法错误
verbose           -v                     在运行命令前回送它们
xtrace               -x                     回送进行替换处理后的命令

脚本a.sh的内容为:
set -n
if cd /dev; do
echo "in dev
执行脚本结果:
$ ./a.sh 
./a.sh: line 2: syntax error near unexpected token `do‘
./a.sh: line 2: `if cd /dev; do‘
d

脚本a.sh的内容为:
set -v
echo "1"
echo "2"
执行脚本结果:
$ ./a.sh 
echo "1"
1
echo "2"
2
 
脚本a.sh的内容为:
set -x
echo "$PWD"
执行脚本结果:
++ echo /home/yanwenjie/bashtest
/home/yanwenjie/bashtest
-x选项将回送经过参数替换、命令替换和其他命令行处理步骤后得到的命令行结果。
x选项在每一行开始都打印+,(但是不知道为什么我这边打印了2个),这实际上可以定制的,它是内置变量shell变量PS4的值。可以
通过修改PS4的值来修改这个符号。
例如脚本a.sh的内容如下:
PS4="debug->"
set -x
echo "$PWD"
执行结果:
$ ./a.sh 
ddebug->echo /home/yanwenjie/bashtest
/home/yanwenjie/bashtest
(不知道为什么这边出现了2个d。。谁能回答一下)

让我们简单回顾一下PS1,PS2,PS3的作用:
PS1是用来控制shell提示符的样式。例如我登陆shell的式样是:root@ywjPC:~# 
PS2是当我们输入"\"时,多行提示符的样式,默认是">".
PS3是Shell脚本中使用select时的提示符。

2.伪信号

伪信号和工作方式和trap一样,但它们时由shell本身产生,可以像对待shell脚本里的实际信号一样对待它。
伪信号     发送时间
EXIT         shell从脚本中退出后
DEBUG   shell已经执行了一个语句

2.1.EXIT

例如下面的脚本a.sh:
trap "echo ‘exit from shell‘" EXIT
echo "hello"
执行结果:
# ./a.sh 
hello
exit from shell

2.2.DEBUG

DEBUG用来在一个函数或脚本内所有语句后执行陷阱代码。它的主要用途是用来作为一种跟踪错误的程序状态元素的强制性
方法。
例如下面的脚本a.sh:
function dbgtrap
{
echo "i=$i"
}

i=1
trap dbgtrap DEBUG
i=$((i+1))
i=$((i+1))
i=$((i+1))
trap - DEBUG
脚本中两个trap之间的每条语句执行后都会执行dbgtrap函数,包含第一个trap语句。
执行结果:
# ./a.sh 
i=1
i=2
i=3
i=4
其中i=1是trap dbgtrap DEBUG语句执行后输出的。