난 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
또는 예약어 바로 다음의 테스트의 일부인 경우 쉘은 종료되지 않습니다.if
elif
&&
또는||
목록에서 실행되는 명령의 일부&&
마지막 또는 다음 명령을 제외하고||
, 마지막 명령을 제외한 파이프라인의 모든 명령 또는 반환 값 이 와 동일한 명령!
.
]
게다가POSIX쉘 명령 언어사양 이것이 올바른 동작인지 확인하세요.
, 또는 예약어의 복합 목록
-e
, 예약어로 시작하는 파이프 또는 마지막 항목을 제외한 모든 AND-OR 목록을 따르는 명령을 실행할 때 이 설정은 무시되어야 합니다.while
until
if
elif
!
그리고섹션 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는 실행 종료를 트리거하지 않습니다.