当前位置:   article > 正文

Shell内建命令之trap_shell trap命令

shell trap命令

trap [-lp] [arg] [sigspec …],当shell接收到信号sigspec时,将读取和执行arg中的命令。如果命令arg未指定并且只有一个sigspec或者为“-”,信号trap状态被重置为shell初始状态。如果命令arg为空字符串,信号被忽略。如果未指定arg并且使用了-p选项,shell显示与每个sigspec相关联的trap命令。如果没有提供参数或者只有-p选项,。-l选项,打印信号名字及其对应的数字信号列表。sigspec参数要么是信号名,要么是信号名对应的数字。信号名不区分大小写,并且前缀SIG是可省略的。

除-l选项打印的信号外,还有几种特殊的信号。如果sigspec是0或EXIT,shell退出时执行arg。如果sigspec是DEBUG,arg命令将在每个简单命令、for、case、select、运算命令、shell函数中第一个命令之前执行。有关extdebug选项对DEBUG trap的影响的详细信息,请参阅shopt内置命令对extdebug选项的描述。如果sigspec是RETURN,每次通过内建命令.或source执行完函数或脚本后执行arg命令。

如果sigspec是ERR,只要有管道、列表和组合命令,就会执行arg命令,并返回非零退出状态,但是一下例外情况不会执行:

1.失败的命令是紧跟在until或while关键字之后的命令列表的一部分。

2.if或elif关键字之后的test的一部分。

3.在&&或||列表中执行的命令的一部分(除非命令紧跟在最后的&&或||之后)。

4.管道中除最后一条以外的任何命令。

5.命令的返回状态使用!进行了取反。

以上五种情况,同样适用于errexit(-e)选项。

在进入shell时已经忽略的信号不能进行trap和重置。在子shell或子shell环境中,没有被忽略的trap信号将重置为其原始值。

除非sigspec指定了无效的信号,否则返回0。

  1. #!/bin/bash
  2. foo_exit(){
  3. echo "exit invoked"
  4. }
  5. foo_return(){
  6. echo "return invoked"
  7. }
  8. foo_debug(){
  9. echo "debug invoked"
  10. }
  11. trap foo_exit EXIT
  12. trap foo_return RETURN
  13. trap foo_debug DEBUG
  14. dotest(){
  15. echo "doTest invoked"
  16. }
  17. foo_sigint(){
  18. echo "sigint invoked"
  19. }
  20. trap foo_sigint SIGINT
  21. dotest
  22. sleep 10

运行结果:

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号