|| 뒤의 Union 명령(또는) 연산자

|| 뒤의 Union 명령(또는) 연산자

아래와 같은 코드를 작성할 때 명령문 다음에 여러 명령을 실행할 수 있습니다 else.

if [ "$?" -eq 0 ]
    then              
        echo "OK"
    else 
        echo "NOK"
        exit 1
fi

그러나 다른 구문을 사용할 때는 다음을 수행할 수 없습니다.또는:

[ "$?" -eq 0 ] && echo "OK" || (echo "NOK" >&2 ; exit 1)

내 사용 사례에는 를 기반으로 하는 복잡한 스크립트가 있으므로 "$?" == 0메시지가 잘못된 경우(메시지를 에코하는 것 외에도) 중단할 방법을 찾고 있습니다.

답변1

이 쌍은 ( )하위 쉘을 생성하여 내부 종료 명령을 사용하여 전체 스크립트를 종료하려는 목표를 무너뜨립니다.

자동 구분 기호 대신 명령과 더 유사 하므로 다음 ( )으로 바꾸십시오 . 후행 공백 과 내부의 마지막 명령은 일부 종결자로 끝나야 합니다: fits). 그러면 동일한 쉘 체인에서 명령이 실행되므로 종료됩니다 이 쉘에 영향을 미칩니다.{ }{ }{;

[ "$?" -eq 0 ] && echo "OK" || { echo "NOK" >&2; exit 1;}

업데이트: @D.BenKnoble은 echo실패해야 하며 이전 if ...; then ... else ... fi구성처럼 작동하지 않아야 한다고 언급했습니다. 따라서 첫 번째 echo종료 코드는 noop 명령을 사용하여 "이스케이프"해야 합니다 :(내장 명령은 실패하지 않습니다).

[ "$?" -eq 0 ] && { echo "OK"; :;} || { echo "NOK" >&2; exit 1;}

인용하다:

POSIX:

그룹화 명령

그룹화 명령의 형식은 다음과 같습니다.

(compound-list)
     Execute compound-list in a subshell environment; see Shell
     Execution Environment. Variable assignments and built-in commands 
     that affect the environment shall not remain in effect
     after the list finishes.

[...]

{ compound-list;}
     Execute compound-list in the current process environment. The
     semicolon shown here is an example of a control operator delimiting
     the } reserved word. Other delimiters are possible, as shown
     in Shell Grammar; a <newline> is frequently used.

대시 맨페이지,배쉬 맨페이지,...

답변2

한 가지 방법은 다음 스크립트 줄을 사용하는 것입니다.

[ "$?" -eq 0 ] && echo "OK" || exit $(echo "NOK" >&2 ; echo 1)

그 목적은 오류를 보고하고 오류 코드를 반환하는 동시에 "확인" 경로를 선택한 경우 침묵을 유지하는 것입니다.

답변3

문제는 서브셸에서 다른 분기를 실행하고 있다는 것입니다(대괄호 안에 있는 내용입니다. 예를 들어 bash(1)매뉴얼 페이지에서 찾아보세요 compound commands). 따라서 exit스크립트를 실행한 쉘이 아닌 서브셸을 종료합니다. 좀 더 그래픽적으로 보려면 sleep두 버전의 코드를 충분히 오래 두고 실행하거나 ps faux( coreutils버전의 경우 ps) 유사한 항목을 실행 pstree하여 프로세스 상위 관계를 확인하세요.

이제 "수정"하는 방법은 다음과 같습니다.

  1. 괜찮아요 if ... then / else / fi. 특히 긴 블록의 경우 코드를 더 읽기 쉽게 만듭니다.

  2. 패드를 원하시면 이렇게 하시면 됩니다

    [ "$?" -eq 0 ] && echo "OK" || echo "NOK" >&2 && exit 1
    

    이는 정상적으로 종료하거나 그룹 명령을 사용하는 것에 의존합니다.

    [ "$?" -eq 0 ] && echo "OK" || { echo "NOK" >&2 ; exit 1; }
    

    쉘의 일반적인 사용성 및 특수성을 확인하십시오. 예를 들어 줄 바꿈이나 세미콜론으로 끝나야 합니다.

  3. 가장 포괄적인 - 신호/이벤트 핸들러 사용( bash예: 다른 쉘은 다른 구문을 가질 수 있음):

    #!/bin/bash
    
    exit_handler () {
        echo "error happened, exiting"
        ... fix things, that may be half baked ...
    }
    
    trap exit_handler EXIT
    
    ... do stuff ...
    

    이를 통해 다음과 같은 기회를 얻을 수 있습니다.

    • 사용 set -e( set -o errexit) 이것은 일반적으로 위험한 것으로 간주됩니다. EXIT핸들러는 남기고 싶지 않은 임시 파일을 삭제하는 등의 작업을 수행할 수 있습니다.
    • 정리 코드를 한 곳에만 배치하세요.
    • kill또한 다른 신호(예:

관련 정보