如何在 Shell 脚本函数完成时始终执行命令?

如何在 Shell 脚本函数完成时始终执行命令?

我需要编写一个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 是0EXIT并且 trap 语句在函数体内执行,则命令 arg 会在函数完成后执行。... 如果 sig 是0EXIT并且 trap 语句未在函数体内执行,则命令 arg 会在 shell 终止时执行。

bash命令是trap ... RETURN

如果一个信号规格EXIT(0),命令 arg 在退出 shell 时执行...如果信号规格RETURN,命令精氨酸每次使用 shell 函数或内置命令执行的脚本完成执行时都会.执行source

相关内容