명령 대체에서 스크립트를 종료하는 중 오류가 발생했습니다.

명령 대체에서 스크립트를 종료하는 중 오류가 발생했습니다.

기능이 있는 경우:

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"
}

자세한 설명.

관련 정보