赞
踩
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
运行结果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。