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

如何在Bash脚本退出之前运行命令?,bash,Bash,如果Bash脚本具有set-e,并且脚本中的命令返回错误,那么如何在脚本退出之前进行清理 例如: #!/bin/bash set -e mkdir /tmp/foo # ... do stuff ... rm -r /tmp/foo 如何确保删除/tmp/foo,即使中的某个命令。。。执行任务…失败?来自集合的参考: -e 如果简单命令(请参阅第3.2.1节简单命令)以非零状态退出,则立即退出,除非失败的命令是TILL或while循环的一部分、if语句的一部分、&&或| |列表的一部分,或者如

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

例如:

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

如何确保删除
/tmp/foo
,即使
中的某个命令。。。执行任务…
失败?

来自
集合的参考:

-e

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


(我的重点)。

来自
bash
手册页(关于内置):

陷阱[-lp][[arg]sigspec…]
命令arg将在shell 接收信号sigspec


因此,如中所示,在脚本的早期调用
trap
,以设置所需的ERR处理程序。

下面是一个使用trap的示例:

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

sh
版本的devguydavid

#/垃圾箱/垃圾箱
set-e
清理(){
回显“删除/tmp/foo”
rm-r/tmp/foo
}
陷阱清理出口
mkdir/tmp/foo
asdffdsa失败

ref:

运行
help trap
查看内置的帮助。
POSIX
让我微笑。:)您也链接到了一个很棒的教学网站。当使用“-E”时,可能值得添加“-E”,请参阅