위 줄에 성공적인 명령을 삽입하면 명령 대체( )가 예상대로 작동하지 않는 이상한 상황에 직면했습니다 $(I mean this)
. 명령이 실패하고 err_exit가 설정되어 있어도 종료되지 않습니다.
나는 항상 이것이 내가 생각했던 것과 다르게 동작하는 서브쉘과 관련이 있다고 생각했지만 완전히 확신할 수는 없습니다.
그러면 "위에서 종료했어야 합니다"가 인쇄됩니다.
#!/usr/bin/env zsh
setopt local_options err_exit warn_create_global nounset
local x
if false; then
else
x=$(false)
echo 'should have exited above'
fi
이것은 아무것도 인쇄하지 않습니다:
#!/usr/bin/env zsh
setopt local_options err_exit warn_create_global nounset
local x
if false; then
else
true
x=$(false)
echo 'should have exited above'
fi
분명히 스크립트를 에 남겨두면 스크립트가 작동하도록 할 수 있지만 true
옳지 않은 것 같고 설명할 수도 없습니다. 그렇다면 무슨 일이 일어났으며 권장되는 솔루션은 무엇입니까?
답변1
이것은 실수입니다. 이것은 더 작은 테스트 케이스입니다.
set -e; if false; then :; else x=$(false); echo "$? $-"; fi
할당 x=$(false)
에는 마지막 명령 대체 상태(1)가 있어야 합니다. 그렇지 않은 경우 set -e
이 코드 조각이 인쇄되어야 하며 1
그 뒤에 활성 셸 옵션이 표시되어야 합니다. 사용되면 set -e
이 코드 조각은 아무것도 인쇄하기 전에 종료되어야 합니다.
Zsh 5.1.1은 잘 작동합니다(상태 1로 종료됨). Dash, bash, mksh, ksh93은 모두 동일한 동작을 합니다.
오늘 Git에서 체크아웃한 Zsh는 1 569Xe
상태 0으로 인쇄하고 종료합니다. false
before 호출을 추가하면 echo
스크립트가 예상대로 종료됩니다. 영향이 있어야 하지만 그렇지 않은 것 errexit
같습니다. 설명하다x=$(false)
git bisect
b581c3fece76c87ed86ae9fc704d0fcf208a79d3첫 번째 잘못된 커밋입니다.
지금이야zsh 직원 메일링 리스트에 보고됨그리고몇 시간 후에 해결됨존재하다그 약속다음 버전에 포함될 예정입니다.