왜! set -e를 사용하는 연산자는 실제 반환 값에 대해서도 항상 성공합니까?

왜! set -e를 사용하는 연산자는 실제 반환 값에 대해서도 항상 성공합니까?

내가 사용하고 있는 시스템의 스크립트는 다음을 활용합니다 set -e.

#!/bin/sh
set -e
echo 1
true
echo 2
true
echo 3
false
echo notreached

내가 이렇게 하면:

#!/bin/sh
set -e
echo 1
true
echo 2
true
echo 3
! false
echo reached

...마지막 행에 도달했습니다. 그러나 이렇게 하면:

#!/bin/sh
set -e
echo 1
true
echo 2
true
echo 3
! true
echo reached

! true...마지막 줄에 도달해야 하더라도 false.

추가 테스트:

user@linux:~$ ! false && echo ok
ok
user@linux:~$ ! true && echo ok
user@linux:~$ 

...그러므로 이러한 상황에서 !운영자는 정상적으로 작동할 수 있습니다.

그러나 에서는 제대로 작동하지 않습니다 set -e. 왜?

관련된:http://mywiki.wooledge.org/BashFAQ/105...내 질문에 대한 답변은 아니지만.

답변1

표준에 따르면 다음과 같습니다.

-e
이 옵션이 켜져 있으면 다음 경우를 제외하고 명령이 실패할 때 [...] 쉘이 즉시 종료되어야 합니다.

  1. while, Until, if 또는 elif 예약어 뒤에 오는 복합 목록을 실행할 때는 -e 설정을 무시해야 합니다.!로 시작하는 파이프라인 예약어, 또는 목록의 마지막 명령을 제외한 모든 명령을 AND-OR합니다.

http://pubs.opengroup.org/onlinepubs/9699919799.2018edition/utilities/V3_chap02.html#set

배쉬 매뉴얼이것도 지적되었지만 약간 다른 용어로 사용됩니다.

내 생각에 BashFAQ의 항목은 세부 사항을 설명하려고 시도하지도 않은 것 같습니다. "이 규칙은 매우 복잡합니다"라는 문구가 충분히 명확합니다. 링크된 페이지에는 한 사람이 알고 싶어하는 것보다 더 많은 내용이 있는 것 같습니다.

관련 정보