首页 > 代码库 > 《学习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
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‘
./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"
echo "1"
echo "2"
执行脚本结果:
$ ./a.sh
echo "1"
1
echo "2"
2
echo "1"
1
echo "2"
2
脚本a.sh的内容为:
set -x
echo "$PWD"
echo "$PWD"
执行脚本结果:
++ echo /home/yanwenjie/bashtest
/home/yanwenjie/bashtest
/home/yanwenjie/bashtest
-x选项将回送经过参数替换、命令替换和其他命令行处理步骤后得到的命令行结果。
x选项在每一行开始都打印+,(但是不知道为什么我这边打印了2个),这实际上可以定制的,它是内置变量shell变量PS4的值。可以
通过修改PS4的值来修改这个符号。
例如脚本a.sh的内容如下:
PS4="debug->"
set -x
echo "$PWD"
echo "$PWD"
执行结果:
$ ./a.sh
ddebug->echo /home/yanwenjie/bashtest
/home/yanwenjie/bashtest
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"
echo "hello"
执行结果:
# ./a.sh
hello
exit from shell
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
{
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
i=2
i=3
i=4
其中i=1是trap dbgtrap DEBUG语句执行后输出的。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。