ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

trap命令Linux

2020-09-18 19:01:05  阅读:342  来源: 互联网

标签:function shell echo 命令 EXIT trap Linux LINENO


 

trap命令用于捕获指定的信号并执行预定义的命令,为shell内置命令

 

 有两个常用选项

 

 

 

基本语法:

trap 'command' signal

signal是要捕获的信号,command是捕获到信号后,将要执行的命令,命令可以是若干条shell语句,也可以是一个函数

shell脚本在执行时,会产生三个"伪信号"(由shell产生,与os无关),trap也可捕获这三个"伪信号"

 

shell "伪信号"

  • 信号名     产生时间
  • EXIT        从一个函数中退出或整个脚本执行完毕
  • ERR        当一条命令返回非0状态
  • DEBUG   脚本中每条命令执行之前

 

  1. 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中)
    下面为使用""的情况

     

     

  2. 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

     

     

  3. 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 '############################'

     

     

标签:function,shell,echo,命令,EXIT,trap,Linux,LINENO
来源: https://www.cnblogs.com/dissipate/p/13692986.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有