그래서 저는 이것을 읽었습니다: `set -e`를 사용하는 Bash 스크립트는 `... && ...` 명령에서 중지되지 않습니다.
이것은 의미가 있습니다. 이제 질문은 다음과 같습니다.
테스트 A:
$ cat ./test.sh
set -ex
source foo && true
echo 'running'
$ ./test.sh
++ source foo
./test.sh: line 16: foo: No such file or directory
$ echo $?
1
테스트 B:
$ cat ./test.sh
set -ex
cat foo && true
echo 'running'
$ ./test.sh
++ cat foo
cat: foo: No such file or directory
++ echo running
running
$ echo $?
0
source
이 규칙을 위반한 유일한 이유는 무엇 입니까?용감한)?
실패한 명령이 while 또는 Until 키워드 바로 뒤의 명령 목록의 일부이거나 if 또는 elif 예약어 뒤의 테스트의 일부인 경우 쉘은 종료되지 않습니다.마지막 && 다음에 나오는 명령을 제외하고 && 또는 || 목록의 일부로 실행되는 모든 명령또는 ||, 마지막 명령을 제외한 파이프라인의 모든 명령 또는 !로 반전된 명령의 반환 값입니다.
답변1
source
.
는 소위 도트 명령이라고 하는 도트 명령 의 별칭입니다 special command
. 여기서 POSIX는 이러한 명령을 오류 발생 시 전체 비대화형 셸을 종료하는 것으로 설명합니다.
다음을 통해 명령을 호출하는 경우:
bash test.sh
bash는 종료되지 않지만 호출할 때:
bash -o posix test.sh
종료됩니다. 따라서 bash는 기본적으로 POSIX 호환으로 컴파일되거나 실제로 bash와 다른 쉘을 호출하고 있습니다.
바라보다http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_14표준으로.