`-set & e`가있는 Bash 스크립트는`… &&…`명령에서 멈추지 않습니다.


14

첫 번째 오류에서 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


첫 번째 예에서 어떤 일이 일어날 것으로 예상하십니까?
Flup

@Flup 나는 실패한 cd명령 후에 스크립트가 멈출 것으로 예상한다
907th

1
행동이 놀라운 장소에 대한 일반적인 논의는 BashFAQ # 105 를 참조하십시오 set -e.
Charles Duffy

답변:


10

이것은 문서화 된 동작입니다. 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 목록은 연산자 " &&"및 " ||"로 구분 된 하나 이상의 파이프 라인 시퀀스입니다 .


9

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

감사합니다! (대신 ) echo "printed"및 사용하는 것이 더 명확 할 echo "not_printed"것입니다 echo 1.
907th

3
set -e에서 출구 원인 (false && true); echo not here에 있지만 { false && true; }; echo hereYMMV하지만 다른 조개와 같은 쉘의 경우에도 다른 버전. set -e바지선으로 만지지 않고 대신 적절한 오류 처리를 수행합니다.
Stéphane Chazelas

1

내 생각에 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는 실행 종료를 트리거하지 않습니다.


하지만 저는 사용하지 않습니다if ... fi
907th

나는 이것이 암시 적 인 것임을 알고있다.
Archemar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.