Content #
trap命令可以指定shell脚本需要侦测并拦截的Linux信号。如果脚本收到了trap 命令中列出的信号,则该信号不再由shell处理,而是由本地处理。
trap命令的格式如下:
trap commands signals
在trap命令中,需要在commands部分列出想要shell执行的命令,在signals部分列出想要捕获的信号(多个信号之间以空格分隔)。指定信号的时候,可以使用信号的值或信号名。
下面这个简单的例子展示了如何使用trap命令捕获SIGINT信号并控制脚本的行为:
$ cat trapsignal.sh
#!/bin/bash
#Testing signal trapping
#
trap "echo ' Sorry! I have trapped Ctrl-C'" SIGINT
#
echo This is a test script.
#
count=1
while [ $count -le 5 ]
do
echo "Loop #$count"
sleep 1
count=$[ $count + 1 ]
done
#
echo "This is the end of test script."
exit
$
每次侦测到SIGINT信号时,本例中的trap命令都会显示一行简单的文本消息。捕获这些信号可以阻止用户通过组合键Ctrl+C停止脚本: $ ./trapsignal.sh This is a test script. Loop #1 Loop #2 ^C Sorry! I have trapped Ctrl-C Loop #3 ^C Sorry! I have trapped Ctrl-C Loop #4 Loop #5 This is the end of test script. $ 每次使用Ctrl+C组合键,脚本都会执行trap命令中指定的echo语句,而不是忽略信号并让shell停止该脚本。
如果脚本中的命令被信号中断,使用带有指定命令的trap未必能让被中断的命令继续执行。为了保证脚本中的关键操作不被打断,请使用带有空操作命令的trap 以及要捕获的信号列表,例如:
trap "" SIGINT
这种形式的trap命令允许脚本完全忽略SIGINT信号,继续执行重要的工作。
From #
Linux命令行与shell脚本编程大全