より高い機能から戻る方法 - 可能であれば?

より高い機能から戻る方法 - 可能であれば?

(可能な場合)どのように(可能な場合)移動するのかを調べるには、いくつかの問題があります。高い関数の簡単な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 = source から my シェルに直接移動し、.bash_aliasesこのファイルは.bashrcmy in Effective.

  • 私が望むのは直接返すことができるということですsudoedit_err。しかし、私はできません。 POSIXスクリプトクラスが欠落していると確信しています。

答え1

いくつかの人々がサブシェルの使用を提案していますが、私の考えではこれが良い考えだと思います。これにより、サブシェルから2番目の関数を呼び出すラッパー関数を導入できます。このようにして、2番目の関数から呼び出されるすべての関数を呼び出してexitサブシェルを終了できます。

以下は、元の投稿に基づいた例です。

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 "$@")
}

ラップされた関数を直接呼び出すとシェルが終了するため、望ましくありません。

関連情報