shell

trap命令

trap命令用于捕获指定的信号并执行预定义的命令。
其基本的语法是 : trap ‘command’ signal
其中signal是要捕获的信号,command是捕获到指定的信号之后,所要执行命令(一条或多条合法的shell语句/ 一个函数名)。
shell脚本在执行时,会产生三个所谓的“伪信号”, (之所以称之为“伪信号”是因为这三个信号是由shell产生的,而其它的信号是由操作系统产生的),通过使用trap命令捕获这三个“伪信号”并输出相关信息对调试非常有:帮助。

shell伪信号 :

信号名何时
EXIT从一个函数中退出或整个脚本执行完毕
ERR当一条命令返回非零状态时(代表命令执行不成功)
DEBUG脚本中每一条命令执行之前
通过捕获EXIT信号,我们可以在shell脚本中止执行或从函数中退出时,输出某些想要跟踪的变量的值,并由此来判断脚本的执行状态以及出错原因,
其使用方法是: trap ‘command’ EXIT 或 trap ‘command’ 0
代码块
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
在调试过程中,为了跟踪某些变量的值,我们常常需要在shell脚本的许多地方插入相同的echo语句来打印相关变量的值,这种做法显得烦琐而笨拙。而通过捕获DEBUG信号,我们只需要一条trap语句就可以完成对相关变量的全程跟踪。
以下是一个通过捕获DEBUG信号来跟踪变量的示例程序:
代码块
##$ 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值