我很确定我的问题的答案是否定的,但我正在寻求确认。
在Ruby中,以下块:
begin
foo
rescue
bar
ensure
baz
end
将开始执行foo
,如果出现任何错误,它将停止执行foo
,而开始执行bar
。
ensure
块是将最后运行的代码,而不管在foo
期间是否有任何错误。
Java具有相同的结构,但关键字是try
、catch
和finally
。
这是我想在bash脚本中完成的部分:我想要一段代码,它将在脚本的最后运行,或者在出现错误并且脚本想要退出后立即运行。
有办法做到这一点吗?
假设:
fo
是一个bash函数,在成功时返回0
bar
和baz
是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
。