如果一个Bash脚本有set -e
,并且脚本中的一个命令返回一个错误,那么在脚本退出之前我怎么做一些清理?如何在Bash脚本退出之前运行命令?
例如:
#!/bin/bash
set -e
mkdir /tmp/foo
# ... do stuff ...
rm -r /tmp/foo
我怎样才能确保/tmp/foo
被删除,即使在... do stuff ...
失败的命令吗?
如果一个Bash脚本有set -e
,并且脚本中的一个命令返回一个错误,那么在脚本退出之前我怎么做一些清理?如何在Bash脚本退出之前运行命令?
例如:
#!/bin/bash
set -e
mkdir /tmp/foo
# ... do stuff ...
rm -r /tmp/foo
我怎样才能确保/tmp/foo
被删除,即使在... do stuff ...
失败的命令吗?
下面是使用陷阱的例子:
#!/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]:~ $
的通知。
从set
参考:
-e
退出立即如果一个简单的命令(见第3.2.1节简单命令)退出时非零状态,除非在命令失败是until或while循环的一部分,是if语句的一部分,是& &或||的一部分。列表,或者如果命令的返回状态正在使用!反转。 如果设置了ERR,则会在shell退出前执行陷阱。
(Emphasis mine)。
从bash
手册页(关于内建):
陷阱[-lp] [[参数] SIGSPEC ...]
命令arg的要被读取和执行时的壳 接收信号(s)sigspec。
所以,在Anon.'s answer指示,调用trap
在脚本年初成立你ERR渴望的处理程序。
你也可以在EXIT上陷阱。 – 2010-01-25 03:15:27
运行'help trap'来查看内置的一些帮助。 – Flimm 2014-02-27 13:20:43