로컬 fn=$(...)가 $를 마스크하는 이유는 무엇입니까? 상태 코드

로컬 fn=$(...)가 $를 마스크하는 이유는 무엇입니까? 상태 코드

두 가지 함수 정의의 유일한 차이점은 첫 번째는 local저장 키워드를 할당과 결합하고 두 번째는 이를 분리한다는 것입니다.

function foo {
    local fn=$(mktemp -p /path/does/not/exist 2>/dev/null)
    echo $?
}

function bar {
    local fn
    fn=$(mktemp -p /path/does/not/exist 2>/dev/null)
    echo $?
}

foo
bar

처음에는 "0"이고 그 다음에는 "1"입니다. 먼저 "1"을 에코한 다음 "1"을 에코하고 싶습니다. 값은 $?명령 대체 결과가 아닌 로컬에 할당한 결과인 것 같습니다.

bash 4.2.46(1)-릴리스가 왜 이렇게 동작합니까?

답변1

나는 이 동작이 문제이기 때문에 명시적으로 문서화되었다고 생각했지만(특히 -o errexit! 로 bash 스크립트를 실행할 때), 그렇지 않은 것 같습니다. 내 매뉴얼 사본에는 다음과 같이 명시되어 있습니다(about , global함수 내부에서와 동일하게 동작함).local

잘못된 옵션이 발견되지 않는 한 '-f foo=bar'를 사용하여 함수를 정의해 보고, 읽기 전용 변수에 값을 할당해 보고, 복합 할당 구문을 사용하지 않고 배열 변수에 값을 할당해 보세요. [...] , 이름 중 하나가 유효한 쉘 변수 이름이 아닙니다. 읽기 전용 변수에 대한 읽기 전용 상태를 끄거나, 배열 변수에 대한 배열 상태를 끄거나, -f를 사용하여 존재하지 않는 함수를 표시해 보십시오. 그렇지 않으면 반환 상태는 0입니다.

따라서 이는 다른 프로그래밍 언어에서 예상되는 키워드로 보이지 않습니다 local. 할당과 유사한 매개변수가 인수에 제공되면 local대신 초기화를 한정하지 않습니다.local 내장 명령할당이 발생하도록 담당하며 반환 코드는 local 초기화 프로그램에서 실행될 수 있는 코드가 아닌 그 자체이며 해당 반환 코드는 위에 나열된 조건 목록에서만 0이 아닙니다.

Bishop이 댓글에서 언급했듯이 좀 더 문자 그대로 질문에 답하기 위해 bash 관리자인 Chet Ramey는 local할당 중에 반사 실패가 발생하는 것을 고려할 것인지 묻는 질문을 받고 기본적으로 다음과 같이 대답했습니다.local과제가 주요 업무 가 아닙니다. :

왜냐하면 그것은 지역사회와 그 형제자매들이 [...] 하는 일이 아니기 때문입니다. 이러한 내장 함수는 변수 속성을 할당하고 수정하기 위해 존재합니다. 추가 기능으로 할당도 지원하는데 중요한 기능은 속성 설정입니다. 값이 어떻게 계산되는지 알 필요가 없습니다. [...] 함수가 속성이나 값을 설정하므로 종료 상태는 작업이 성공했는지 여부를 반영해야 합니다.

zsh동일한 동작이 셸에서도 관찰될 수 있다는 점은 주목할 가치가 있습니다 .

해결책은 다음 두 작업을 분리하는 것입니다.

local variable
variable=$( somecommand )

exit_status=$?

관련 정보