[英]How to run a command before a Bash script exits?
如果 Bash 脚本set -e
,并且脚本中的命令返回错误,我如何在脚本退出之前进行一些清理?
例如:
#!/bin/bash
set -e
mkdir /tmp/foo
# ... do stuff ...
rm -r /tmp/foo
我如何确保/tmp/foo
被删除,即使... do stuff ...
中的命令之一失败?
以下是使用陷阱的示例:
#!/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行失败,仍会执行清理。
从bash
页(关于内置):
陷阱[-lp] [[arg] sigspec ...]
当shell接收sigspec信号时,将读取并执行命令arg。
因此,正如Anon。的回答所示 ,在脚本的早期调用trap
来设置ERR所需的处理程序。
从set
的参考:
-e
如果一个简单的命令(参见3.2.1简单命令)以非零状态退出,则立即退出,除非失败的命令是until或while循环的一部分,if语句的一部分,&&或||的一部分。 列表,或者如果使用!反转命令的返回状态。 ERR上的陷阱(如果已设置)将在shell退出之前执行。
(强调我的)。
sh
版本的devguydavid的答案 。
#!/bin/sh
set -e
cleanup() {
echo "Removing /tmp/foo"
rm -r /tmp/foo
}
trap cleanup EXIT
mkdir /tmp/foo
asdffdsa #Fails
ref: shellscript.sh
我不知道这对你来说是之前还是之后。
您可以将脚本设置为在使用“陷阱”关闭后立即运行。 然后你可以关闭终端。
例如;
trap ./val.sh EXIT #set command you want to run after close terminal
kill -9 $PPID #kill current terminal
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.