trap语句-(陷阱,信号捕获)
时间:2019-04-16 23:59:05 来源:igfitidea点击:
在运行脚本时,用户可以按Break或CTRL+C来终止进程。
用户也可以通过按CTRL+Z来停止进程。
由于shell脚本中的错误(比如算术溢出)可能会发生错误。这可能会导致错误或不可预知的输出。
每当用户中断时,就向命令或脚本发送一个信号。
信号就会强制脚本退出。
但是,trap命令可以捕获一个中断。
trap命令可以提供一个脚本用来捕获中断的信号,然后在脚本中清除它。
语法
trap arg signal trap command signal trap 'action' signal1 signal2 signalN trap 'action' SIGINT trap 'action' SIGTERM SIGINT SIGFPE SIGSTP trap 'action' 15 2 8 20
示例
#!/bin/bash # 捕获0号中断 trap 'echo "捕获退出信号0..."' 0 # 显示 echo "测试" # 使用0信号退出shell脚本 exit 0
运行脚本,将输出:
测试 捕获退出信号0...
第一行设置了一个陷阱,当脚本试图以状态0退出时,则会被捕获。
然后当脚本以状态0退出shell时,将运行echo命令。
示例2
定义一个shell变量
file=/tmp/nofound.txt
确保/tmp/nofound.txt文件不存在,尝试删除文件
rm $file
输出:
rm: cannot remove `/tmp/nofound.txt': No such file or directory
现在我们为rm命令设置陷阱(信号捕获程序)
trap "rm $file; exit" 0 1 2 3 15
显示已定义的陷阱列表:
trap
现在再次尝试删除文件:
rm $file
这一次rm命令没有显示错误了。 当捕捉到信号0、1、2、3或15时,trap命令简单地退出。
Linux 如何清除陷阱trap (信号捕获程序)
使用以下语法来清除陷阱:
trap - signal trap - signal1 signal2
例如,为rm命令设置一个陷阱:
file=/tmp/notfound.txt trap 'rm $file' 1 2 3 15 trap
清除信号SIGINT(2):
trap - SIGINT trap
清除所有信号
trap - 1 2 3 15 trap