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