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

时间:2010-01-25 02:42:15

标签: bash

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

例如:

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

即使/tmp/foo中的某个命令失败,我如何确保删除... do stuff ...

4 个答案:

答案 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