"로컬"이 종료 코드를 캡처하도록 하려면 어떻게 해야 합니까?

"로컬"이 종료 코드를 캡처하도록 하려면 어떻게 해야 합니까?

내 프로젝트에는 다음과 같은 스니펫이 있습니다.

local output="$(bash "${1##*/}")"
echo "$?"

그러나 이는 항상 0 을 인쇄하므로 local삭제하면 변수가 올바르게 작동 local하게 됩니다 . 이는 서브셸의 종료 코드를 가정하는 것입니다.$?

내 질문은: 종료 값을 캡처하는 동안 이 변수를 로컬 변수로 어떻게 유지할 수 있습니까?

답변1

할당하기 전에 지역 변수를 선언하세요.

thing() {
  local output
  output="$(bash "${1##*/}")"
  echo "$?"
}

제 생각에는 추가 변수를 설정하는 것보다 이것이 RET더 읽기 쉽습니다 . 이것에 대해서는 YMMV이지만 예상대로 작동합니다.

답변2

#!/bin/bash
thing() {
   local foo=$(asjkdh) ret="$?"
   echo "$ret"
}

127그러면 "명령을 찾을 수 없음"에 대한 올바른 오류 코드가 표시됩니다 .

이를 사용하여 local여러 변수를 정의할 수 있습니다. 따라서 RET성공하기 전에 서브셸의 종료 코드를 캡처하고 이를 0으로 설정하기 위해 로컬 변수도 만들었습니다 .local$?

관련 정보