在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已经运行了一个语句
注意:是伪信号,在真正的信号中是不包括这两个的。
注意:是伪信号,在真正的信号中是不包括这两个的。
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"
echo "hello"
运行结果:
# ./a.sh
hello
exit from shell
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
{
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语句运行后输出的。