如何在shell中处理异常(Part 2)

本文来自于我的个人博客http://www.log4myself.com/archives/363

前言

在前面一片文章里《如何在shell中处理异常(PART1)》,简单得介绍了几种如何在shell中处理异常的方法,本文继续介绍几种用法,其实说是几种,就一种。。就是合理使用trap。本文主要还是讲如何用在shell中用trap去处理各种事情,当然不仅仅是指异常。不过,我们首先应该讲得是异常。

用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做一些其他事情。

扩展阅读-使用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

posted @ 2012-12-18 21:40  clam  阅读(2556)  评论(0编辑  收藏  举报