如何在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相关的参考。 看一看。