`-set & e`가있는 Bash 스크립트는`… &&…`명령에서 멈추지 않습니다. echo 123 echo “I’m running! =P” $ $ ./script ./script:

첫 번째 오류에서 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는 실행 종료를 트리거하지 않습니다.


답변