`funcstack`을 확장하는 방법은 무엇입니까?

`funcstack`을 확장하는 방법은 무엇입니까?

set -e내장 함수 1을 사용하면 오류로 인해 쉘이 종료되므로 좋은 생각이 아닙니다.

따라서 쉘 함수에서많은내 코드는 다음과 같습니다

[[ -e $file ]] || {
    printf -- 'foo: %s does not exist\n' $file >&2
    return -1
}

...이건 투박할 뿐만 아니라 최고 수준입니다 funcstack. error최소한 위의 코드를 다음과 같이 압축할 수 있는 함수가 있다면 좋을 것입니다.

[[ -e $file ]] || error -1 '%s does not exist' $file

다음과 같은 오류 함수를 작성하여 사용하세요.설명했다함수와 반대되는 스크립트는 그리 어렵지 않습니다.

error () {
    local exitstatus=$1
    shift

    {
        printf -- '%s: ' "${funcstack[2]}"
        printf -- "$@"
        printf -- '\n'

    } >&2

    exit $exitstatus
}

...하지만 다른 함수 내부에서 이 함수를 호출하는 것은 나쁜 생각이고, 같은 이유로 set -e함수 내부에서도 나쁜 생각입니다.

원하는 기능을 달성하기 위해 필요한 것은 error호출 셸의 "최상위 수준"으로 제어권을 되돌리는 방법입니다(따라서 funcstack호출 시 임의로 길어질 수 있는 를 지우는 방법 error).

이를 수행할 수 있는 방법이 있습니까?


추신: 물론 저는 다음과 같은 순진한 접근 방식을 시도했습니다.

error () {
    local exitstatus=$1
    shift

    {
        printf -- '%s: ' "${funcstack[2]}"
        printf -- "$@"
        printf -- '\n'
    } >&2

    funcstack=()
}

...하지만 (놀랍지도 않게) zsh다음 중 어떤 것도 없습니다.

error:10: read-only variable: funcstack

1 이 기사에서는 "대화형 사용을 위한 쉘 함수 내에서 또는 소스 가져오기를 위한 스크립트 내에서"를 줄여서 "함수 내에서"와 같은 표현을 사용합니다.

관련 정보