Linux

從更高的功能返回,如何 - 如果可能的話?

  • November 8, 2020

我很難弄清楚如何——如果可能的話——從更高的函式返回,讓我給你看一個 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

...

先說重要說明:

  • 這些函式直接從.bash_aliases文件 = 獲取到我的 shell,該文件由 my .bashrcin effect 提供。
  • 我想要什麼:sudoedit_err能夠直接返回,這是我做不到的,我很確定我只是錯過了一類 POSIX 腳本。😠️
  • 儘管如此,我的預設 shell 是 Bash,但該解決方案必須符合 POSIX。

我發現了什麼:

  • 不能使用exit 1而不是return 1= 它將退出終端。

有幾個人建議使用 subshel​​l,我認為這是個好主意。使用它,您可以引入一個包裝函式,該函式在子外殼中呼叫第二個函式。這樣,第二個函式呼叫的任何函式都可以呼叫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。

引用自:https://unix.stackexchange.com/questions/618484