本文来自于我的个人博客http://www.log4myself.com/archives/363
在前面一片文章里《如何在shell中处理异常(PART1)》,简单得介绍了几种如何在shell中处理异常的方法,本文继续介绍几种用法,其实说是几种,就一种。。就是合理使用trap。本文主要还是讲如何用在shell中用trap去处理各种事情,当然不仅仅是指异常。不过,我们首先应该讲得是异常。
之前在《shell中的trap和expr》里简单得介绍过了trap,所以这次我们就直接上代码,上处理异常的代码,这样更加清晰明了,简单直接。
先再重复下trap的使用方法吧:
trap [COMMAND] [SIGNAL]
代表trap会捕获信号[SIGNAL]后运行[COMMAND]
下面看段实例: #!/bin/bash trap “echo Fail unexpectedly on line \$FILENAME:\$LINENO!” ERR mkdir xxxx rm xxx
这段代码可以简单得说明了trap在处理异常的应用,后面那个ERR,就是捕获所有非0返回的shell执行,如果非0,那就是异常,就会被trap直接捕获,而不会继续往下执行了。在本文中的shell还会打印出文件名和行号等信息,当然,这些你可以自由发挥了。当然,trap其实不仅仅可以做这一件事情,还有好多事情,他可以捕获各种信号,当然除了SIGKILL,所以,你可以使用trap做一些其他事情。
什么是工作环境的清理呢,其实就是一般我们日常shell中可能会有各种临时文件,那留下这些文件总是不好的,所以你可以借用trap进行清理。我们看下下面这个shell程序
#!/bin/bash
TEMP_FILE=/tmp/printfile.txt
pr $1 > $TEMP_FILE
echo -n "Print file? [y/n]: "
read
if [ "$REPLY" = "y" ]; then
less $TEMP_FILE
fi
rm $TEMP_FILE
这段代码的作用其实就是把用户一开始输入的存到一个临时文件里,然后询问下用户是否查看,如果查看就给print出来。当当然,用户看得话,没什么问题。看完了后,程序也就完了,临时文件也就删了。但关键是,如果程序在运行中异常终止了呢,或者用户直接按ctrl+C给终止了,这样,就会有一个临时文件留下。这个时候,你就可以去运用trap给你做些处理了。
#!/bin/bash
TEMP_FILE=/tmp/printfile.txt
trap "rm $TEMP_FILE; exit" SIGHUP SIGINT SIGTERM
pr $1 > $TEMP_FILE
echo -n "Print file? [y/n]: "
read
if [ "$REPLY" = "y" ]; then
lpr $TEMP_FILE
fi
rm $TEMP_FILE
看上面这个程序,即使用户按下了ctrl+C ,trap也会可以捕获到,这样无论如何,临时文件都会被清理掉。
好了,就说这么多了,没啥技术含量,就是玩玩。
http://www.linuxcommand.org/wss0160.php