语法
示例
防止脚本执行中断导致文件未清除
#!/bin/sh
trap cleanup 1 2 3 6
cleanup()
{
echo "Caught Signal ... cleaning up."
rm -rf /tmp/temp_*.$$
echo "Done cleanup ... quitting."
exit 1
}
### main script
for i in *
do
sed s/FOO/BAR/g $i > /tmp/temp_${i}.$$ && mv /tmp/temp_${i}.$$ $i
done
上述代码将当前文件夹的文件中所有的FOO替换为BAR,写入到临时文件/tmp/temp_${i}.$$再写回到当前文件。如果在执行中途中断,可能仍然在/tmp中有临时文件。trap语句表示在信号1、2、3、6时执行cleanup()函数。常用的CTRL-C是信号2(SIGINT)。
一个有趣的例子
#!/bin/sh
trap 'increment' 2
increment()
{
echo "Caught SIGINT ..."
X=`expr ${X} + 500`
if [ "${X}" -gt "2000" ]
then
echo "Okay, I'll quit ..."
exit 1
fi
}
### main script
X=0
while :
do
echo "X=$X"
X=`expr ${X} + 1`
sleep 1
done
示例中有一个变量X,每隔1s增加1,并打印出来。当捕获到CTRL-C不会立即退出,而是让变量增加500,当变量大于2000时脚本才会退出。如下:
当然所有脚本都能用kill -9 <PID>退出。
一些信号
| Number | SIG | 含义 |
|---|---|---|
| 0 | 0 | On exit from shell |
| 1 | SIGHUP | Clean tidyup |
| 2 | SIGINT | Interrupt |
| 3 | SIGQUIT | Quit |
| 6 | SIGABRT | Abort |
| 9 | SIGKILL | Die Now (cannot be trapped) |
| 14 | SIGALRM | Alarm Clock |
| 15 | SIGTERM | Terminate |
注意如果脚本运行在忽略信号的环境下,比如通过nohup运行,那么脚本仍然会忽略这些信号。
参考: