`set -e`를 사용하는 Bash 스크립트는 `... && ...` 명령에서 중지되지 않습니다.

`set -e`를 사용하는 Bash 스크립트는 `... && ...` 명령에서 중지되지 않습니다.

set -e익숙해첫 번째 오류 발생 시 bash 스크립트 중지.

다음 명령을 사용할 때를 제외하고는 모든 것이 잘 작동합니다 &&.

$ cat script
set -e
cd not_existing_dir && echo 123
echo "I'm running! =P"
$
$ ./script
./script: line 2: cd: not_existing_dir: No such file or directory
I'm running! =P
$

비교:

$ cat script
set -e
cd not_existing_dir
echo "I'm running! =P"
$
$ ./script
./script: line 2: cd: not_existing_dir: No such file or directory
$

첫 번째 예는 여전히 echo 이지만 I'm running!두 번째 예는 그렇지 않습니다. 왜 그들은 다르게 행동합니까?

UPD. 유제:https://stackoverflow.com/questions/6930295/set-e-and-short-tests

답변1

이는 문서화된 동작입니다. 이것bash(1) 매뉴얼 페이지말하자면set -e,

while실패한 명령이 또는 키워드 바로 다음의 명령 목록의 일부이거나 until또는 예약어 바로 다음의 테스트의 일부인 경우 쉘은 종료되지 않습니다.ifelif&&또는 ||목록에서 실행되는 명령의 일부&&마지막 또는 다음 명령을 제외하고|| , 마지막 명령을 제외한 파이프라인의 모든 명령 또는 반환 값 이 와 동일한 명령 !.
]

게다가POSIX쉘 명령 언어사양 이것이 올바른 동작인지 확인하세요.

, 또는 예약어의 복합 목록 -e, 예약어로 시작하는 파이프 또는 마지막 항목을 제외한 모든 AND-OR 목록을 따르는 명령을 실행할 때 이 설정은 무시되어야 합니다.whileuntilifelif!

그리고섹션 2.9.3목록이 파일의 정의

&&AND-OR 목록은 " " 및 " " 연산자로 구분된 하나 이상의 파이프 시퀀스입니다 ||.

답변2

set -e옵션은 어떤 경우에는 효과가 없습니다. 이는 표준 동작이며 POSIX 호환 셸 간에 이식 가능합니다.


실패한 명령은 파이프라인의 일부입니다.

false | true; echo printed

인쇄됩니다 printed.

그리고 파이프라인 자체의 실패만 고려하세요.

true | false; echo 'not printed'

아무것도 인쇄되지 않습니다.


실패한 명령이 while, until, 예약어 뒤의 복합 목록, 예약어로 시작 if하는 파이프 또는 목록의 일부 또는 elif마지막 명령을 제외한 모든 명령에서 실행되었습니다.!&&||

false || true; echo printed

마지막 명령의 실패는 여전히 영향을 미칩니다 set -e.

true && false; echo 'not printed'

이것서브쉘복합 명령이 실패했습니다.

(false; echo 'not printed') | cat -; echo printed

답변3

내 생각에는 if-then 조건이 전체적으로 true로 평가되는 것 같습니다.

나는 노력했다

set -e
if cd not_existing_dir
then  echo 123
fi
echo "I'm running! =P"

누가 주는가

-bash: cd: not_existing_dir: No such file or directory
I'm running! =P

오류 코드는 if 조건에 의해 포착되므로 bash는 실행 종료를 트리거하지 않습니다.

관련 정보