相当于 Ruby 的 sure 或 Java 最终在 shell 脚本中的保证?



我很确定我的问题的答案是否定的,但我正在寻求确认。

在Ruby中,以下块:

begin
  foo
rescue
  bar
ensure
  baz
end

将开始执行foo,如果出现任何错误,它将停止执行foo,而开始执行bar

ensure块是将最后运行的代码,而不管foo期间是否有任何错误。

Java具有相同的结构,但关键字是trycatchfinally

这是我想在bash脚本中完成的部分:我想要一段代码,它将在脚本的最后运行,或者在出现错误并且脚本想要退出后立即运行。

有办法做到这一点吗?

假设:

  • fo是一个bash函数,在成功时返回0
  • barbaz是bash函数

以下行为应符合您的期望:

foo
if [[ $? != 0 ]]; then
    bar
fi
baz

较短的版本:

if ! foo; then
    bar
fi
baz

您可以安装一个陷阱处理程序,该程序将在退出时运行,无论是从显式exit命令还是从到达脚本末尾。

trap 'echo script exiting with exit code $?' EXIT

Bash有许多伪信号:

EXIT代码在退出脚本时执行

RETURN代码在调用return(通常在函数中)时执行

DEBUG代码在每个语句上执行

ERR代码在出现错误时执行(条件是一种特殊情况)

您可以使用ERR伪信号在出现错误时设置trap处理程序。例如:

foo() {
    echo "Executing foo"
    return 1    # non-zero is a failure
}
bar() {
    echo "Executing bar"
}
baz() {
    echo "Executing baz"
} 
trap 'bar' ERR
foo
# Reset trap
trap - ERR
baz

提供:

Executing foo
Executing bar
Executing baz

如果foo被更改为返回零:

Executing foo
Executing baz

函数通常不会继承ERR陷阱,但请参见set -E

相关内容

  • 没有找到相关文章

最新更新