첫 번째 오류에서 bash 스크립트set -e
를 중지 하는 데 사용 합니다 .
다음과 함께 명령을 사용하지 않으면 모두 정상적으로 작동합니다 &&
.
$ 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
$
첫 번째 예제는 여전히 에코 I'm running!
하지만 두 번째 예제는 에코 하지 않습니다. 왜 다르게 행동합니까?
UPD. 비슷한 질문 : /programming/6930295/set-e-and-short-tests
답변
이것은 문서화 된 동작입니다. bash는 (1) 매뉴얼 페이지 에 대해 말한다 set -e
,
실패 명령이 즉시 다음 명령 목록의 일부인 경우 쉘은 종료되지 않습니다
while
또는until
키워드, 다음 시험의 일부if
또는elif
예약어,
A의 실행 모든 명령의 일부&&
또는||
목록
최종 다음 명령을 제외하고&&
또는||
어떤, 파이프 라인의 명령이지만 마지막 명령이거나 명령의 반환 값이로 반전되는 경우!
.
[공포도 추가]
그리고 POSIX Shell Command Language Specification
은 이것이 올바른 동작인지 확인합니다.
-e
다음과 같은 화합물 목록을 실행할 때 설정을 무시해야한다while
,until
,if
, 또는elif
예약어의로 시작하는 파이프 라인!
예약 된 단어, 또는 마지막 이외의 AND-OR리스트의 모든 명령.
및 제 2.9.3 목록 이 문서를 정의의
AND-OR 목록은 연산자 ”
&&
“및 ”||
“로 구분 된 하나 이상의 파이프 라인 시퀀스입니다 .
답변
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
답변
내 생각에 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는 실행 종료를 트리거하지 않습니다.