首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从更高的功能返回,如何-如果可能的话?

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

Unix & Linux用户
提问于 2020-11-07 13:09:39
回答 1查看 32关注 0票数 1

如果可能的话,我很难弄清楚如何从更高的函数返回,让我向您展示POSIX代码提示:

代码语言:javascript
复制
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

...

重要说明首先:

  • 这些函数直接来自.bash_aliases文件=,该文件实际上是由我的.bashrc提供的。
  • 我想要的是:sudoedit_err能够直接返回,这是我做不到的,我很确定我错过了一个POSIX脚本的类。️
  • 尽管如此,我的默认shell是Bash,解决方案必须符合POSIX。

我发现的是:

  • 不能使用exit 1代替return 1 =,它会退出终端。
EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2020-11-08 02:22:57

有几个人提出了一个子壳,我认为这是个好主意。使用它,您可以引入一个包装器函数,该函数在子subshell中调用第二个函数。这样,第二个函数调用的任何函数都可以调用exit来终止子subshell。

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

代码语言:javascript
复制
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。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/618484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档