如果Bash脚本有set -e
,并且脚本中的命令返回错误,如何在脚本退出之前进行一些清理?
例如:
#!/bin/bash
set -e
mkdir /tmp/foo
# ... do stuff ...
rm -r /tmp/foo
即使/tmp/foo
中的某个命令失败,我如何确保删除... do stuff ...
?
答案 0 :(得分:170)
以下是使用陷阱的示例:
#!/bin/bash
set -e
function cleanup {
echo "Removing /tmp/foo"
rm -r /tmp/foo
}
trap cleanup EXIT
mkdir /tmp/foo
asdffdsa #Fails
输出:
dbrown@luxury:~ $ sh traptest
t: line 9: asdffdsa: command not found
Removing /tmp/foo
dbrown@luxury:~ $
请注意,即使asdffdsa行失败,仍然会执行清理。
答案 1 :(得分:9)
从bash
联机帮助页(关于内置版):
陷阱[-lp] [[arg] sigspec ...]
命令arg是在shell时读取和执行的 接收信号sigspec。
因此,如Anon.'s answer所示,请在脚本的早期调用trap
来设置ERR所需的处理程序。
答案 2 :(得分:6)
来自set
的参考:
<强> -e 强>
如果一个简单的命令(参见3.2.1简单命令)以非零状态退出,则立即退出,除非失败的命令是until或while循环的一部分,if语句的一部分,&amp; amp的一部分;&安培;或||列表,或者如果使用!反转命令的返回状态。 ERR上的陷阱(如果已设置)将在shell退出之前执行。
(强调我的)。
答案 3 :(得分:1)
sh
版的devguydavid的answer。
#!/bin/sh
set -e
cleanup() {
echo "Removing /tmp/foo"
rm -r /tmp/foo
}
trap cleanup EXIT
mkdir /tmp/foo
asdffdsa #Fails
ref:shellscript.sh