从更高的功能返回,如何 - 如果可能的话?

从更高的功能返回,如何 - 如果可能的话?

我有点难以弄清楚如何(如果可能的话)从更高函数,让我向您展示一个 POSIX 代码花絮:

sudoedit_err ()
{
    printf >&2 'Error in sudoedit_run():\n'
    printf >&2 '%b\n' "$@"
}

sudoedit_run ()
{
    # `sudoedit` is part of `sudo`'s edit feature
    if ! command -v sudo > /dev/null 2>&1; then
        sudoedit_err "'sudo' is required by this script."
        return 1
    fi
    # primary non-empty arguments check
    if ! { [ $# -ge 3 ] && [ -n "$1" ] && [ -n "$2" ] && [ -n "$3" ]; } then
        sudoedit_err "Low number of arguments.\\nExpected: \$1 = editor type; \$2 = editor name; \$3, (\$4), ... = file(s).\\nPassed $#: $*"
        return 1
    fi

...

首先重要说明:

  • 这些函数直接从 file = 来源到我的 shell,.bash_aliases该文件是由 my .bashrcin effective 来源的。

  • 我想要的是:能够sudoedit_err直接返回,这是我做不到的,我很确定我错过了一类 POSIX 脚本。

答案1

有几个人建议使用 subshel​​l,我认为这是一个好主意。使用它,您可以引入一个包装函数来调用子 shell 中的第二个函数。这样,第二个函数调用的任何函数都可以调用exit来终止子 shell。

这是一个基于您的原始帖子的示例:

sudoedit_err() {
    printf >&2 'Error in sudoedit_run():\n'
    printf >&2 '%b\n' "$@"
    exit 1
}

_sudoedit_run() {
    # `sudoedit` is part of `sudo`'s edit feature
    if ! command -v sudo > /dev/null 2>&1; then
        sudoedit_err "'sudo' is required by this script."
    fi
    # primary non-empty arguments check
    if ! { [ $# -ge 3 ] && [ -n "$1" ] && [ -n "$2" ] && [ -n "$3" ]; } then
        sudoedit_err "Low number of arguments.\\nExpected: \$1 = editor type; \$2 = editor name; \$3, (\$4), ... = file(s).\\nPassed $#: $*"
    fi
}

sudoedit_run()
{
    (_sudoedit_run "$@")
}

您不想直接调用包装的函数,因为这会终止您的 shell。

相关内容