trap命令Linux
trap命令用于捕获指定的信号并执行预定义的命令,为shell内置命令
有两个常用选项
基本语法:
trap 'command' signal
signal是要捕获的信号,command是捕获到信号后,将要执行的命令,命令可以是若干条shell语句,也可以是一个函数
shell脚本在执行时,会产生三个"伪信号"(由shell产生,与os无关),trap也可捕获这三个"伪信号"
shell "伪信号"
- 信号名 产生时间
- EXIT 从一个函数中退出或整个脚本执行完毕
- ERR 当一条命令返回非0状态
- DEBUG 脚本中每条命令执行之前
- EXIT
通过捕获EXIT信号,可以在shell脚本中止执行或从函数中退出时,输出某些想要跟踪变量的值
trap 'COMMAND' EXIT
1 #!/bin/env sh 2 3 function exittrap(){ 4 echo "[LINE:$1] Error: Command or Function exited with status $?" 5 } 6 #trap 'errtrap $LINENO' EXIT 7 trap "errtrap $LINENO" EXIT 8 9 function vbn(){ 10 echo 'vbn' 11 } 12 13 vbn
需要对trap后的command加''进行保护,否则LINENO在第六行就会被替换,输出的行号LINENO==1,是因为进到函数vbn执行的时候打开了子shell,LINENO是按照子shell来计数,执行完echo命令后,立即调用了全局errtrap函数(此时,仍在子shell中)
下面为使用""的情况 - ERR
通过捕获ERR信号,我们可以追踪执行不成功的命令或函数
#!/bin/evn sh function errtrap() { echo "[LINE:$1] Error: Command or function exited with status $?" } function foo() { return 0; } function bar() { return 1; } trap 'errtrap $LINENO' ERR zxc foo bar
- DEBUG
通过捕获DEBUG信号,我们只需要一条trap语句就可以完成相关变量的全程跟踪
#!/bin/env sh 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 '############################'