《学习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已经执行了一个语句

注意:是伪信号,在真正的信号中是不包含这两个的。linux的信号如下:
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP  
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1  
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM  
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP  
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ  
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR  
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3  
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8  
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13  
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12  
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7  
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2  
63) SIGRTMAX-1  64) SIGRTMAX

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语句执行后输出的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值