您的位置:首页 > 运维架构 > Shell

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

2014-08-10 21:58 253 查看
在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

例如采用kill的方式则无法执行trap代码。

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语句执行后输出的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: