기능이 있는 경우:
myfunction() {
[ -d somedirectory ] && [ "some other condition" ] || { echo "error" >&2 ; exit 1; }
global_var=somevalue
}
다른 함수에서 호출합니다.
some_other_function() {
myfunction
# Do something with "$global_var"
}
이는 예상대로 작동합니다.조건이 myfunction
실패하면 오류 종료로 인해 전체 스크립트가 종료됩니다.다른 코드가 실행되는 것을 방지합니다.
(소스 파일에서) 다른 스크립트와 함수 정의를 공유하는 매우 큰 스크립트를 리팩토링할 때 다음과 같이 일부 전역 변수를 반환하여 이를 제거하고 싶습니다.
myfunction() {
[ -d somedirectory ] && [ "some other condition" ] || { echo "error" >&2 ; exit 1; }
local somevar=somevalue
# do stuff with "$somevar", then...
# return value of somevar to calling function.
printf %s "$somevar"
}
some_other_function() {
local anothervar="$(myfunction)"
# Do something with "$another_var"
}
그러나 여기서 오류 종료가 예상대로 작동하지 않습니다. 스크립트를 종료하지 않고 명령 대체 때문에 서브쉘에서 실행되는 함수만 종료합니다.
(전역 변수를 사용하는 대신) 함수에서 텍스트 값을 반환할 수 있도록 이 큰 스크립트를 모듈화하는 방법이 있습니까?그리고 여전히 함수가 전체 스크립트에서 오류 종료를 허용합니까?
답변1
메인 쉘에 신호를 보내야 합니다:
# start of the main script:
MAIN_SHELL_PID=$$
[...]
myfunction() {
... || { echo "error" >&2 ; kill -HUP "$MAIN_SHELL_PID"; }
}
답변2
더 간단한 해결책은 로컬 선언과 할당을 두 개의 개별 명령문으로 작성하는 것입니다. 이렇게 하면 함수의 종료 상태가 할당의 종료 상태로 유지되므로 함수에 오류가 발생하는 경우 while 스크립트를 종료하는 데 도움이 됩니다.
some_other_function() {
local anothervar
anothervar="$(myfunction)"
# Do something with "$another_var"
}