trap指令
在脚本中遇到:
trap “exit -1” 9
所以研究下trap起到的作用
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
trap是一个shell内建命令,它用来在脚本中指定信号如何处理。
比如,按Ctrl+C会使脚本终止执行,实际上系统发送了SIGINT信号给脚本进程,SIGINT信号的默认处理方式就是退出程序。
如果要在Ctrl+C不退出程序,那么就得使用trap命令来指定一下SIGINT的处理方式了。
trap命令不仅仅处理Linux信号,还能对脚本退出(EXIT)、调试(DEBUG)、错误(ERR)、返回(RETURN)等情况指定处理方式。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
一、linux信号
信号 值 描述
1 SIGHUP 挂起进程
2 SIGINT 终止进程 (信号组合键:Ctrl+C)
3 SIGQUIT 停止进程
9 SIGKILL 无条件终止进程
15 SIGTERM 尽可能终止进程
17 SIGSTOP 无条件停止进程,但不是终止进程
18 SIGTSTP 停止或暂停进程,但不终止进程 (信号组合键:Ctr+Z)
19 SIGCONT 继续运行停止的进程
默认情况下,bash shell会忽略收到的任何SIGQUIT(3)、SIGTERM(15)信号(正因为这样,交互式shell才不会被终止)。但是bash shell会处理收到的SIGHUP(1)和SIGINT(2)信号。
shell脚本的默认行为会忽略一些信号,但捕获信号-trap命令允许你来指定shell脚本要监视并从shell中拦截的Linux信号。
trap命令的格式为:
trap commands signals。
二、trap使用示例
1.trap “echo Goodbye.” EXIT
在脚本执行完成退出时捕获,脚本执行结束后再执行“echo Goodbye”
2.trap "echo 'Sorry! I have trapped Ctrl-C“ SIGINT
脚本:
#!/bin/bash
trap “echo ‘Sorry! I have trapped Ctrl-C’” SIGINT
echo This is a test script
count=1
while [ $count -le 10 ]
do
echo "Loop
c
o
u
n
t
"
s
l
e
e
p
1
c
o
u
n
t
=
count" sleep 1 count=
count"sleep1count=[ $count + 1 ]
done
echo The end.
执行结果:(阻止用户通过ctrl+c生成的信号SIGINT来停止程序)
This is a test script
Loop 1
Loop 2
^CSorry! I have trapped Ctrl-C
Loop 3
Loop 4
^CSorry! I have trapped Ctrl-C
Loop 5
Loop 6
Loop 7
Loop 8
^CSorry! I have trapped Ctrl-C
Loop 9
Loop 10
The end.
3.修改trap操作
#!/bin/bash
trap “echo ‘Sorry! I have trapped Ctrl-C’” SIGINT
count=1
while [ $count -le 5 ]
do
echo "Loop
c
o
u
n
t
"
s
l
e
e
p
1
c
o
u
n
t
=
count" sleep 1 count=
count"sleep1count=[ $count + 1 ]
done
trap “echo ‘Sorry! The trap has been modified.’” SIGINT
count=1
while [ $count -le 5 ]
do
echo "Loop
c
o
u
n
t
"
s
l
e
e
p
1
c
o
u
n
t
=
count" sleep 1 count=
count"sleep1count=[ $count + 1 ]
done
执行结果:
Loop 1
Loop 2
Loop 3
^CSorry! I have trapped Ctrl-C
Loop 4
Loop 5
Loop 1
Loop 2
Loop 3
^CSorry! The trap has been modified.
Loop 4
Loop 5
The end.
4.删除捕获
命令形式为:trap – ***,例如trap – SIGINT
脚本:
。。。脚本1。。。
trap “xxx” SIGINT
。。。脚本2。。。
trap – SIGINT
执行结果:在执行脚本1的内容时,用ctrl + c组合键不会终止程序,执行到脚本2的内容时,由于删除已设置好的捕获,脚本按照默认的行为来处理SIGINT信号,则此时用ctrl+c组合键会终止脚本运行。