trap简介

trap的格式如下,功能就是捕捉信号,并对信号进行处理

trap [-lp] [[arg] sigspec ...]
  • arg可以是shell命令或者自定义函数
  • sigspec可以是以下的一个或多个
  • 定义在<signal.h>中的信号名或者数值。信号名的大小写不敏感,SIG这个前缀也是可选的。以下的命令的效果都是一样的
trap "echo SIGINT" SIGINT
trap "echo SIGINT" sigint
trap "echo SIGINT" 2
trap "echo SIGINT" int
trap "echo SIGINT" Int

调试脚本时,trap经常用到的信号量

  • EXIT:在shell退出前执行trap设置的命令,也可以指定为0
  • RETURN:在.和``source执行其他脚本返回时,执行trap`设置的命令
  • DEBUG:在任何命令执行前执行trap设置的命令,但对于函数仅在函数的第一条命令前执行一次
  • ERR:在命令结果为非0时,执行trap设置的命令
#! /bin/bash
# 使用trap实现在每个函数开始之前打印以便打印,这样就能准确的定位到函数的位置
# 从而实现对脚本的调试
trap "echo before a func is called" DEBUG
# 当. 或者 source 调用结束的时候出发
trap "echo . or source is called "  RETURN
func()
{echo "不管你信不信,这是一个函数"exit 0
}
# 测试
echo "call ."
. traptest# 函数的调用
func
# DEBUG 查看调试信号是否有效的设置了
# trap -p RETURN
# trap -p DEBUGexit 0

执行结果

andrew@andrew-Thurley:/work/linux-sys/bash/2.基本/src$ bash trap_func.sh
before a func iis called
before a func iis called
call .
before a func iis called
. or source is called
before a func iis called
不管你信不信,这是一个函数
  • trap -l:列出所有信号的数值和名字,类似于kill -l
andrew@andrew-Thurley:~$ trap -l1) SIGHUP    2) SIGINT   3) SIGQUIT  4) SIGILL   5) SIGTRAP6) 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
  • trap -p:列出通过trap设置过的信号处理命令
andrew@andrew-Thurley:~$ trap -p
trap -- 'name ' SIGINT
trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU
trap -- 'name ' RETURN
trap "" sigspec :忽略sigspec指定的信号
trap "do something" sigspec:收到sigspec指定的信号时,do some thing后,继续执行后续命令。
trap sigspec or trap - sigspec:恢复sigspec指定的信号的默认行为

注意

  • 在函数中设置的trap也是全局生效的
#!/bin/bash
# trap设置在函数中的tap也是全局有效的
foo()
{    trap "echo func is called" DEBUG
}# 输出 func is called
foo
# 调试触发
#trap -p DEBUG
# 输出trap -- 'echo func is called' SIGINT
exit 0
  • 对于同一个信号,只有最后一次trap生效
  • trap只在本进程内有效,它的子进程不会继承trap的设置。

使用trap设计一个用于反应程序执行过程的脚本

#!/bin/bash
# 使用trap来捕捉变量值.# EXIT代表在函数退出前,执行trap
trap 'echo Variable Listing --- ret=${ret}' EXITps -A
if [ $? == 0 ];thenecho "commond exec OK!"ret=0
elseret=1
fiecho "注意这里,还没有调用trap"# trap是在退出的时候清理程序时调用的
exit 0

关注,没有广告,还能要资料

trap--shell脚本调试的不二人选相关推荐

  1. shell脚本调试技术

    Shell脚本调试技术 曹 羽中 (caoyuz@cn.ibm.com), 软件工程师, IBM中国开发中心 曹羽中,在北京航空航天大学获得计算机软件与理论专业的硕士学位,具有数年的 unix 环境下 ...

  2. shell 脚本调试

    shell 脚本调试 参数 -x 跟踪脚本 shell 脚本调试参数 -x #BASH [root@74 ~]# bash -x /usr/local/keepalived/haproxy_check ...

  3. 【shell附加课】shell脚本调试方案详解

    文章目录 前言 一. shell脚本开发规范 二. shell脚本调试技巧 1. 使用echo +exit 命令断点调试 2. 使用bash命令参数调优 3. 使用 set 来调试脚本 总结 前言 最 ...

  4. shell脚本——调试(-n / -x /-c)

    我们在前面介绍的调试手段是通过修改shell脚本的源代码,从其输出相关的调试信息来定位错误的,那有没有不修改源代码来调试shell脚本的方法呢?有的,那就是使用shell的执行选项,下面将介绍一些常用 ...

  5. shell脚本调试中打开set选项

    我们在调试shell脚本的时候,不可以避免的会遇到问题,这个时候,假如我们可以跟踪到脚本到底是哪里问了问题,是哪个变量出了问题,这样就对我们的调试是很有帮助的,这里介绍一个shell里面的跟踪选项这里 ...

  6. Linux shell脚本调试

    1.调试脚本 set -e遇到执行非0时退出脚本; set-x打印执行过程; 例1 test1.sh set -e set -x echo // echo start... echo // cat / ...

  7. 如何在 Shell 脚本中执行语法检查调试模式

    我们开启了 Shell 脚本调试系列文章,先是解释了不同的调试选项,下面介绍如何启用shell调试模式. 写完脚本后,建议在运行脚本之前先检查脚本中的语法,而不是查看它们的输出以确认它们是否正常工作. ...

  8. 在 Shell 脚本中跟踪调试命令的执行

    文章目录 shell 脚本调试系列 概述 shell 跟踪执行的重要性 shell 脚本调试系列 本系列的前面部分清晰地阐明了另外两种 shell 脚本调试模式:详细模式和语法检查模式,并用易于理解的 ...

  9. 在 Shell 脚本中执行语法检查调试模式

    文章目录 shell 脚本调试系列 概述 启用 verbose 调试模式 在 Shell 脚本中启用语法检查调试模式 通过修改脚本的首行来启用脚本检查 内置的 set 命令来在脚本中启用调试模式 sh ...

最新文章

  1. 剑指offer:面试题05. 替换空格
  2. 核密度估计python_核密度估计Kernel Density Estimation(KDE)
  3. 快速排序 python菜鸟教程-C 排序算法
  4. 分布式服务框架HSF学习
  5. sql求平均日活_杨学峰博客 | Flask Sqlarchemy实现按日、周、月统计并图表展示
  6. 面向未来 “亿”触即发-中科曙光技术创新大会重磅发布多项创新举措与成果...
  7. 无法访问udemy.com怎么办?
  8. MySQL的备份、还原及恢复
  9. MeterSphere实现“机器人定时在企业微信群中发送消息”功能
  10. AWT_Swing_JTextField (Java)
  11. fopen文件路径怎么写_php的多功能文件操作类
  12. 阿里云发布ET奥运大脑,推进奥运进入数字时代
  13. python数据分析收获与心得体会_初次数据分析--我的心得体会
  14. java big5转换为gbk_简体繁体转换代码(Big5-GB | GBK简体-GBK繁体)
  15. 工厂管理系统(java web前端和后端)
  16. JAVA字符编码:Unicode,GBK,GB2312,UTF-8
  17. 运放输入偏置电流方向_运算放大器输入偏置电流的两种测试方法研究
  18. 读取XML文件时,总报“前言中不允许有内容”
  19. 小学生计算机知识技能竞赛,2016年春季小学生六项技能竞赛计算机试卷.doc
  20. CAD定数等分不显示等分点

热门文章

  1. poj 2079(旋转卡壳)
  2. zoj-3802-Easy 2048 Again
  3. nyoj-492 King(状态压缩)
  4. 聊一聊Python的变量类型判断type和isinstance
  5. jsonpath的用法
  6. pycharm解决Inconsistent indentation:mix of tabs and spaces
  7. Django的中间件
  8. 如何使用 Jenkins、GitHub 和 Docker 在 Azure 中的 Linux VM 上创建开发基础结构
  9. 嵌入式软件设计第12次实验报告-140201235-陈宇
  10. 【学习笔记】【C语言】返回指针的函数