在我的 Bash 脚本中,我想确保脚本在出现错误时立即退出。 (例如,为了避免在 cd some_directory
失败后出现错误的 rm -f *
。)出于这个原因,我总是使用 -e
标志对于 bash。
现在,我还想在我的一些脚本中执行一些清理代码。来自 this blog post我收集了
#!/bin/bash
cd invalid_directory
echo ':('
function clean_up {
echo "> clean_up"
exit 0
}
trap clean_up EXIT
我得到的输出是
./test.sh: line 3: cd: invalid_directory: No such file or directory
:(
> clean_up
所以它按照广告宣传的那样做。但是,当对 bash 使用 -e
时,我只会得到
./test.sh: line 3: cd: invalid_directory: No such file or directory
因此脚本退出而不调用 clean_up
。
如何让 bash 脚本在出现所有错误时都退出并每次都调用清理脚本?
最佳答案
你永远不会到达trap
命令;您的 shell 在配置陷阱之前退出。
set -e
clean_up () {
ARG=$?
echo "> clean_up"
exit $ARG
}
trap clean_up EXIT
cd invalid_directory
echo "Shouldn't reach this"
不过,最好还是do your own error handling .您通常希望根据脚本退出的确切原因为什么 来改变您的行为,如果您为所有 退出运行单个处理程序(即使您将陷阱限制为 ERR
而不是 EXIT
)。
cd invalid_directory || { echo "cd to invalid_directory failed" >&2; exit 1; }
echo "Shouldn't reach this"
这并不意味着您必须放弃 clean_up
函数。它仍然会在显式退出时执行,但它应该被限制为无论为什么您的脚本退出都应该运行的代码。您还可以在 ERR
上设置一个陷阱,以执行仅当您的脚本以非零退出状态退出时才应执行的代码。
关于Bash:出错时退出并清理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36335186/