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。

#!/bin/bash

foo_exit(){
	echo "exit invoked"
}

foo_return(){
	echo "return invoked"
}

foo_debug(){
	echo "debug invoked"
}
trap foo_exit EXIT
trap foo_return RETURN
trap foo_debug DEBUG
dotest(){
	echo "doTest invoked"
}
foo_sigint(){
	echo "sigint invoked"
}
trap foo_sigint SIGINT

dotest
sleep 10

运行结果:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值