如果 Bash 脚本具有 set -e,并且脚本中的命令返回错误,那么在脚本退出之前如何进行一些清理?
set -e
例如:
#!/bin/bash set -e mkdir /tmp/foo # ... do stuff ... rm -r /tmp/foo
即使 ... do stuff ...中的一个命令失败,我如何确保删除 /tmp/foo?
... do stuff ...
/tmp/foo
来自 set的参考文献:
set
E 如果一个简单命令(参见3.2.1节简单命令)以非零状态退出,则立即退出,除非失败的命令是 until 或 while 循环的一部分、 if 语句的一部分、 & & 或 | | 列表的一部分,或者如果命令的返回状态正在使用!.如果对 ERR 设置了陷阱,则在 shell 退出之前执行。
E
如果一个简单命令(参见3.2.1节简单命令)以非零状态退出,则立即退出,除非失败的命令是 until 或 while 循环的一部分、 if 语句的一部分、 & & 或 | | 列表的一部分,或者如果命令的返回状态正在使用!.如果对 ERR 设置了陷阱,则在 shell 退出之前执行。
(强调我的)。
从 bash手册(关于内建) :
bash
陷阱[-lp ][[ arg ] sigspec... ] 命令 arg 将在 shell 接收信号信号规范。
因此,正如在 匿名的回答中指出的,在脚本的早期调用 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 行失败,清理仍然执行。
Devguydavid 的 回答的 sh版本。
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