2010-01-25 141 views
85

如果一个Bash脚本有set -e,并且脚本中的一个命令返回一个错误,那么在脚本退出之前我怎么做一些清理?如何在Bash脚本退出之前运行命令?

例如:

#!/bin/bash 
set -e 
mkdir /tmp/foo 
# ... do stuff ... 
rm -r /tmp/foo 

我怎样才能确保/tmp/foo被删除,即使在... do stuff ...失败的命令吗?

回答

131

下面是使用陷阱的例子:

#!/bin/bash 
set -e 
function cleanup { 
    echo "Removing /tmp/foo" 
    rm -r /tmp/foo 
} 
trap cleanup EXIT 
mkdir /tmp/foo 
asdffdsa #Fails 

输出:即,即使asdffdsa线失败,清理仍然被执行

[email protected]:~ $ sh traptest 
t: line 9: asdffdsa: command not found 
Removing /tmp/foo 
[email protected]:~ $ 

的通知。

5

set参考:

-e

退出立即如果一个简单的命令(见第3.2.1节简单命令)退出时非零状态,除非在命令失败是until或while循环的一部分,是if语句的一部分,是& &或||的一部分。列表,或者如果命令的返回状态正在使用!反转。 如果设置了ERR,则会在shell退出前执行陷阱。

(Emphasis mine)。

9

bash手册页(关于内建):

陷阱[-lp] [[参数] SIGSPEC ...]
命令arg的要被读取和执行时的壳 接收信号(s)sigspec。

所以,在Anon.'s answer指示,调用trap在脚本年初成立你ERR渴望的处理程序。

+3

你也可以在EXIT上陷阱。 – 2010-01-25 03:15:27

+0

运行'help trap'来查看内置的一些帮助。 – Flimm 2014-02-27 13:20:43

6

这里是一个reference为您捕捉信号和设置-e相关。看一看。

+0

这正是我在寻找的谢谢。 – nelaaro 2017-11-03 14:18:28

相关问题