set -e가 전환되어도 다음 bash 라인을 실행하는 방법 [중복]

set -e가 전환되어도 다음 bash 라인을 실행하는 방법 [중복]

다음과 같은 것이 있다고 가정해 보겠습니다.

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 -e0이 아닌 종료 상태가 수신되면 스크립트가 즉시 종료됩니다.실패한 명령이 아닌 한:

  • whileor 키워드 바로 뒤에 오는 명령 목록입니다 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

관련 정보