trap命令
-
trap命令用于捕获指定的信号并执行预定义的命令。
- 其基本的语法是 : trap ‘command’ signal
- 其中signal是要捕获的信号,command是捕获到指定的信号之后,所要执行命令(一条或多条合法的shell语句/ 一个函数名)。
- shell脚本在执行时,会产生三个所谓的“伪信号”, (之所以称之为“伪信号”是因为这三个信号是由shell产生的,而其它的信号是由操作系统产生的),通过使用trap命令捕获这三个“伪信号”并输出相关信息对调试非常有:帮助。
shell伪信号 :
- 其使用方法是: trap ‘command’ EXIT 或 trap ‘command’ 0
信号名 | 何时 |
---|---|
EXIT | 从一个函数中退出或整个脚本执行完毕 |
ERR | 当一条命令返回非零状态时(代表命令执行不成功) |
DEBUG | 脚本中每一条命令执行之前 |
通过捕获EXIT信号,我们可以在shell脚本中止执行或从函数中退出时,输出某些想要跟踪的变量的值,并由此来判断脚本的执行状态以及出错原因,
代码块
ERRTRAP ()
{
grep "something" $LOGFILE 2>>${LOGFILE_ERR} 1>/dev/null
if [ $? -eq 0 ]; then
echo "do something"
fi
}
trap "ERRTRAP" 0
通过捕获ERR信号,我们可以方便的追踪执行不成功的命令或函数,并输出相关的调试信息,以下是一个捕获ERR信号的示例程序,其中的$LINENO是一个shell的内置变量,代表shell脚本的当前行号。
代码块
##cat -n exp1.sh
#!/bin/bash
ERRTRAP()
{
echo "[LINE:$1] Error: Command or function exited with status $?"
}
foo()
{
return 1;
}
trap 'ERRTRAP $LINENO' ERR
abc
foo
##其输出结果如下:
##$ sh exp1.sh
## exp1.sh: line 10: abc: command not found
## [LINE:10] Error: Command or function exited with status 127
## [LINE:11] Error: Command or function exited with status 1
- 以下是一个通过捕获DEBUG信号来跟踪变量的示例程序:
在调试过程中,为了跟踪某些变量的值,我们常常需要在shell脚本的许多地方插入相同的echo语句来打印相关变量的值,这种做法显得烦琐而笨拙。而通过捕获DEBUG信号,我们只需要一条trap语句就可以完成对相关变量的全程跟踪。
代码块
##$ cat –n exp2.sh
#!/bin/bash
trap 'echo “before execute line:$LINENO, a=$a,b=$b,c=$c”' DEBUG
a=1
if [ "$a" -eq 1 ]
then
b=2
else
b=1
fi
c=3
echo "end"
##其输出结果如下:
##$ sh exp2.sh
## before execute line:3, a=,b=,c=
## before execute line:4, a=1,b=,c=
## before execute line:6, a=1,b=,c=
## before execute line:10, a=1,b=2,c=
## before execute line:11, a=1,b=2,c=3
## end
##从运行结果中可以清晰的看到每执行一条命令之后,相关变量的值的变化。同时,从运行结果中打印出来的行号来##分析,可以看到整个脚本的执行轨迹,能够判断出哪些条件分支执行了,哪些条件分支没有执行。
shell