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

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

例如:

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

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

60461 次浏览

来自 set的参考文献:

E

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

(强调我的)。

bash手册(关于内建) :

陷阱[-lp ][[ arg ] sigspec... ]
命令 arg 将在 shell 接收信号信号规范。

因此,正如在 匿名的回答中指出的,在脚本的早期调用 trap来设置您希望在 ERR 上使用的处理程序。

下面是一个使用陷阱的例子:

#!/bin/bash -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 行失败,清理仍然执行。

Devguydavid 的 回答sh版本。

#!/bin/sh
set -e
cleanup() {
echo "Removing /tmp/foo"
rm  -r /tmp/foo
}
trap cleanup EXIT
mkdir /tmp/foo
asdffdsa #Fails

档号: Shellscript

我不知道是之前还是之后,对你来说是否重要。

您可以设置一个脚本运行后立即与“陷阱”关闭。然后您可以关闭终端。

例如:

    trap  ./val.sh EXIT  #set command you want to run after close terminal
kill -9 $PPID        #kill current terminal