多数用户习惯使用〈Ctrl+C〉键来中断正在运行的程序。如果在按下〈Ctrl+C〉键时,希望程序不仅停止运行,还能做其他动作,如给用户一些提示、清理程序运行中产生的垃圾文件等;或者希望程序能忽略〈Ctrl+C〉键。这样的要求可以通过内置命令trap实现,它的常用格式为:
commands代表一条或多条命令,用分号间隔命令;signals代表一个或多个信号,信号之间要加空格。trap命令的作用是为signals设置陷阱,当shell收到signals中的某个信号时,就运行commands。
脚本non_stop_while_1.sh中包含一个无穷while循环,运行它,屏幕上将一直显示I studybash,直到按下〈Ctrl+C〉键才停止。
在脚本中加入一句trap命令,得到non_stop_while_2.sh:
trap命令的作用是,当收到信号2(即SIGINT,也就是用户按下〈Ctrl+C〉键)时,显示Istopnow.Bye-bye.,然后执行命令exit,退出脚本的运行。试一试该脚本:
使用trap命令,还能忽略信号。trap''2的作用是,当收到信号2时,不做任何事情(因为两个单引号之间为空命令),就是忽略信号2。把上面的脚本中的trap命令改为trap''2之后,得到下面的脚本:
运行脚本non_stop_while_3.sh,再按〈Ctrl+C〉键,无穷循环不会终止,因为〈Ctrl+C〉键被忽略了。如何终止它呢?使用本章前面刚刚讲过的知识,按下〈Ctrl+Z〉键将它挂起,再运行命令kill%%或者kill%+终止刚刚挂起的作业。
命令trap-l的结果与kill-l相同:(www.xing528.com)
命令trap-p或者不带选项和参数的trap的作用是列出已经设置的与每个信号相关的trap命令,例如:
对某信号的处理,想恢复默认设置的话,运行命令trap加该信号。如:
注意trap6和trap''6是不一样的,看下面的例子:
运行trap''6之后,shell收到信号6时会忽略它(两个单引号之间为空)。运行trap 6之后,shell收到信号6,会按照系统默认的方式处理该信号,原先系统默认怎么处理就怎么处理。
当在函数里定义trap的时候需要注意,在函数被调用之前,trap是不生效的。
信号SIGKILL和SIGSTOP不能被捕获、阻塞或忽略,就是说,对这两个信号设置陷阱是无效的。命令kill -19(或者-STOP,或者-SIGSTOP)加进程号或作业号可强行暂停进程或作业。9.4节讲过,终止不掉的进程用kill-9(或者-KILL,或者-SIGKILL)加进程号即可强行终止,是因为信号KILL不能被捕获,并不是因为9在单个数字中是“老大”。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。