다음과 같은 것이 있다고 가정해 보겠습니다.
set -e;
echo 'doing some stuff'
false;
status=$?
post_hook send-message-elsewhere-with-status $status
내가 원하는 것을 수행하는 한 가지 방법은 다음과 같습니다.
set -e;
echo 'doing some stuff'
(
set +e
false;
status=$?
post_hook send-message-elsewhere-with-status $status
)
그런데 다른 방법이 있나요?
답변1
귀하의 질문은 실제로 달성하려는 것이 무엇인지 결정하는 데 많은 맥락을 제공하지 않지만남자 난교분명히 set -e
0이 아닌 종료 상태가 수신되면 스크립트가 즉시 종료됩니다.실패한 명령이 아닌 한:
while
or 키워드 바로 뒤에 오는 명령 목록입니다until
.if
또는 예약어 뒤의 테스트elif
;&&
||
마지막 또는 다음 명령을 제외하고 또는 목록에서 실행되는 모든 명령 .&&
||
- 마지막 명령을 제외한 파이프라인의 모든 명령 또는
- 명령의 반환 값이
'!'
.
따라서 서브셸 외에도 명령을 일부로 예약하여 명령이 0이 아닌 반환으로 실패하는 경우 다음 줄이 실행되도록 하는 여러 옵션이 있습니다.
답변2
조건부로 영향을 받지 않는 특정 행이 있는 경우 set -e
다음을 수행할 수 있습니다.
false || true
이는 다음과 같이 단축될 수 있습니다.
false || :
아니면 가장 신비롭게도:
false||:
여러 줄이 있는 경우 중괄호로 묶습니다.
{ false; false; } || true
이는 false
오류 코드를 반환할 수 있는 모든 코드를 나타냅니다. 물론 출력은 인쇄 되지 않지만 false
다음과 같습니다.ls /bin/bash /bin/bbbbbbbash
표준 출력그리고표준 오류 오류율, 여전히 위의 방법을 사용하고 있습니다.
또는예방접종할 코드를 다음 문장으로 둘러싸세요 set
.
set +e; false ; set -e
참고: 위의 방법은 관련 행이 오류 코드 또는 성공을 반환하는지 여부에 관계없이 작동합니다. 특정 줄이 확실히 오류를 반환한다는 것을 알고 있다면 필요한 것은 리더뿐입니다 !
.
! false