修改或移除信号捕获

修改或移除信号捕获

Content #

要想在脚本中的不同位置进行不同的信号捕获处理,只需重新使用带有新选项的 trap命令即可:

$ cat trapmod.sh
#!/bin/bash
#Modifying a set trap
#
trap "echo ' Sorry...Ctrl-C is trapped.'" SIGINT
#
count=1
while [ $count -le 3 ]
do
     echo "Loop #$count"
     sleep 1
     count=$[ $count + 1 ]
done
#
trap "echo ' I have modified the trap!'" SIGINT
#
count=1
while [ $count -le 3 ]
do
     echo "Second Loop #$count"
     sleep 1
     count=$[ $count + 1 ]
done
#
exit
$

修改了信号捕获之后,脚本处理信号的方式就会发生变化。但如果信号是在捕获被修改前接收到的,则脚本仍然会根据原先的trap命令处理该信号。 $ ./trapmod.sh Loop #1 ^C Sorry…Ctrl-C is trapped. Loop #2 Loop #3 Second Loop #1 Second Loop #2 ^C I have modified the trap! Second Loop #3 $ 如果在交互式shell会话中使用trap命令,可以使用trap -p查看被捕获的信号。如果什么都没有显示,则说明shell会话按照默认方式处理信号。

也可以移除已设置好的信号捕获。在trap命令与希望恢复默认行为的信号列表之间加上两个连字符即可。

$ cat trapremoval.sh
#!/bin/bash
#Removing a set trap
#
trap "echo ' Sorry...Ctrl-C is trapped.'" SIGINT
#
count=1
while [ $count -le 3 ]
do
     echo "Loop #$count"
     sleep 1
     count=$[ $count + 1 ]
done
#
trap -- SIGINT
echo "The trap is now removed."
#
count=1
while [ $count -le 3 ]
do
     echo "Second Loop #$count"
     sleep 1
     count=$[ $count + 1 ]
done
#
exit
$

也可以在trap命令后使用单连字符来恢复信号的默认行为。单连字符和双连字符的效果一样。

移除信号捕获后,脚本会按照默认行为处理SIGINT信号,也就是终止脚本运行。但如果信号是在捕获被移除前接收到的,那么脚本就会按照原先trap命令中的设置进行处理: $ ./trapremoval.sh Loop #1 Loop #2 ^C Sorry…Ctrl-C is trapped. Loop #3 The trap is now removed. Second Loop #1 Second Loop #2 ^C $ 第一个Ctrl+C组合键用于提前终止脚本。因为信号是在捕获被移除前接收的,所以脚本会按照事先的安排,执行trap中指定的命令。捕获随后会被移除,再按 Ctrl+C组合键就能提前终止脚本了。

From #

Linux命令行与shell脚本编程大全