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