명령 대체가 때때로 err_exit를 존중하지 않는 경우가 있습니다.

명령 대체가 때때로 err_exit를 존중하지 않는 경우가 있습니다.

위 줄에 성공적인 명령을 삽입하면 명령 대체( )가 예상대로 작동하지 않는 이상한 상황에 직면했습니다 $(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으로 인쇄하고 종료합니다. falsebefore 호출을 추가하면 echo스크립트가 예상대로 종료됩니다. 영향이 있어야 하지만 그렇지 않은 것 errexit같습니다. 설명하다x=$(false)git bisectb581c3fece76c87ed86ae9fc704d0fcf208a79d3첫 번째 잘못된 커밋입니다.

지금이야zsh 직원 메일링 리스트에 보고됨그리고몇 시간 후에 해결됨존재하다그 약속다음 버전에 포함될 예정입니다.

관련 정보