我需要编写一个zsh
具有多个出口点的函数,并在每个出口点执行相同的清理命令:
function foo {
if ... ; then
...
run_cleanup
return
elif ... ; then
some_command || (run_cleanup ; return 1)
else
...
fi
...
run_cleanup
}
有没有办法避免run_cleanup
在每个出口点重复(这很容易出错)?
答案1
解决方案是使用trap EXIT
,它注册一个清理操作,当函数完成时自动运行:
function foo {
trap run_cleanup EXIT
if ... ; then
...
return
elif ... ; then
some_command || return 1
else
...
fi
...
}
请注意,trap ... EXIT
在函数中使用zsh
-具体的:
如果 sig 是
0
或EXIT
并且 trap 语句在函数体内执行,则命令 arg 会在函数完成后执行。... 如果 sig 是0
或EXIT
并且 trap 语句未在函数体内执行,则命令 arg 会在 shell 终止时执行。
在bash
命令是trap ... RETURN
。
如果一个信号规格是
EXIT
(0),命令 arg 在退出 shell 时执行...如果信号规格是RETURN
,命令精氨酸每次使用 shell 函数或内置命令执行的脚本完成执行时都会.
执行source
。