두 가지 함수 정의의 유일한 차이점은 첫 번째는 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=$?