Bash:出错时退出并清理

标签 bash error-handling

在我的 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/

相关文章:

php - CakePHP:控制台命令中的自定义错误报告

php - 自定义PHP错误消息

iphone - 为 iphone 编写 API 时错误处理的最佳做法是什么?

java - 自动创建 VMware 快照

linux - 如何通过绝对路径运行bash脚本?

php - ImageMagick bash 脚本问题

python - 在Python上使用套接字进行通信

python - Python [Errno 13]-保存用户打开的文件时的异常处理

bash - 带 bash 的条件否定

c++ - c2512 错误 : no appropriate default constructor available