개별 명령에 대해 set -e를 비활성화하는 방법은 무엇입니까?

개별 명령에 대해 set -e를 비활성화하는 방법은 무엇입니까?

set -e 명령은 명령이 0이 아닌 종료 코드를 반환하는 경우 bash 스크립트가 즉시 실패하도록 만듭니다.

  1. 스크립트 내의 개별 명령에 대해 이 동작을 비활성화하는 쉽고 우아한 방법이 있습니까?

  2. Bash 참조 매뉴얼(http://www.gnu.org/software/bash/manual/bashref.html)?

답변1

  1. 이 같은:

    #!/usr/bin/env bash
    
    set -e
    echo hi
    
    # disable exitting on error temporarily
    set +e
    aoeuidhtn
    echo next line
    
    # bring it back
    set -e
    ao
    
    echo next line
    

    달리다:

    $ ./test.sh
    hi
    ./test.sh: line 7: aoeuidhtn: command not found
    next line
    ./test.sh: line 11: ao: command not found
    
  2. set내장 도움말 에 설명되어 있습니다 .

    $ type set
    set is a shell builtin
    $ help set
    (...)
    Using + rather than - causes these flags to be turned off.
    

동일한 내용이 여기에 문서화되어 있습니다.https://www.gnu.org/software/bash/manual/bashref.html#The-Set-Builtin.

답변2

오류에 대한 보석금을 해제하는 대안은 무슨 일이 있어도 성공을 강요하는 것입니다. 다음과 같이 할 수 있습니다:

cmd_to_run || true

그러면 0(true)이 반환되므로 set -e가 트리거되어서는 안 됩니다.

답변3

반환/오류 코드(함수 또는 포크)를 포착하려는 경우 다음과 같이 작동합니다.

function xyz {
    return 2
}

xyz && RC=$? || RC=$?

답변4

매우 간단하다고 생각되는 또 다른 접근 방식은 다음과 같습니다. (및 set이외의 다른 옵션 에도 적용됩니다 -e):

설정을 복원하려면 을 사용하십시오 $-.

예를 들어:

oldopt=$-
set +e
# now '-e' is definitely disabled.
# do some stuff...

# Restore things back to how they were
set -$oldopt

구체적 으로는 -e다른 사람들이 언급한 옵션( || true또는 " if" 안에 넣기)이 더 관용적일 수 있습니다.

관련 정보