在我的Bash脚本中,我想确保一旦出现错误就退出脚本。 (例如,在rm -f *
失败后避免误解cd some_directory
。因此,我总是使用-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
所以它做了广告宣传。但是,当使用-e
进行bash时,我只会得到
./test.sh: line 3: cd: invalid_directory: No such file or directory
因此脚本退出而不调用clean_up
。
如何在所有错误中退出bash脚本和每次调用一个清理脚本?
答案 0 :(得分:5)
你永远不会达到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
上设置一个陷阱来执行只有在脚本退出时具有非零退出状态才能执行的代码。