Linux
從更高的功能返回,如何 - 如果可能的話?
我很難弄清楚如何——如果可能的話——從更高的函式返回,讓我給你看一個 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.bashrc
in effect 提供。- 我想要什麼:
sudoedit_err
能夠直接返回,這是我做不到的,我很確定我只是錯過了一類 POSIX 腳本。😠️- 儘管如此,我的預設 shell 是 Bash,但該解決方案必須符合 POSIX。
我發現了什麼:
- 不能使用
exit 1
而不是return 1
= 它將退出終端。
有幾個人建議使用 subshell,我認為這是個好主意。使用它,您可以引入一個包裝函式,該函式在子外殼中呼叫第二個函式。這樣,第二個函式呼叫的任何函式都可以呼叫
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。