如何在Bash脚本退出之前运行命令?

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

例如:

 #!/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 

输出:

 dbrown@luxury:~ $ sh traptest t: line 9: asdffdsa: command not found Removing /tmp/foo dbrown@luxury:~ $ 

请注意,即使asdffdsa行失败,仍然执行清理。

bash manpage(关于builtins):

陷阱[-lp] [[arg] sigspec …]
当shell接收到信号sigspec时,命令arg将被读取和执行。

所以,正如Anon。的答案所指出的那样,在脚本的早期调用trap来设置你想要的ERR的处理程序。

set的参考:

-e

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

(强调我的)。

这里是关于捕获信号和设置-e相关的参考。 看一看。