我有点难以弄清楚如何(如果可能的话)从更高函数,让我向您展示一个 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.bashrc
in effective 来源的。我想要的是:能够
sudoedit_err
直接返回,这是我做不到的,我很确定我错过了一类 POSIX 脚本。
答案1
有几个人建议使用 subshell,我认为这是一个好主意。使用它,您可以引入一个包装函数来调用子 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。