programing

프로세스 종료 코드를 기반으로 한 셸 스크립트 종료

batch 2023. 4. 21. 20:24
반응형

프로세스 종료 코드를 기반으로 한 셸 스크립트 종료

다수의 명령을 실행하는 셸 스크립트가 있습니다.명령어 중 하나라도 종료 코드가0이 아닌 종료 코드를 사용하여 종료할 경우 셸 스크립트를 종료하려면 어떻게 해야 합니까?

명령어 에 종료 할 수 .$?을 사용하다

ls -al file.ext
rc=$?; if [[ $rc != 0 ]]; then exit $rc; fi

는 piped이므로 .$?파이프 내 마지막 요소의 반환 코드만 제공하므로 코드 내에서는 다음과 같습니다.

ls -al file.ext | sed 's/^/xx: /"

파일이 이 에러 코드입니다).sed파이프라인의 일부가 실제로 작동하고 0이 반환됩니다).

bash이 즉, 「이러한 을 사용할 수 있습니다.PIPESTATUS 요소는, 「1」과 같이 할 수 ${PIPESTATUS[0]}:

pax> false | true ; echo ${PIPESTATUS[0]}
1

은, 「」, 「」의 하는 것에 주의해 주세요.false명령어, 파이프라인 전체가 아닙니다.또한 필요에 따라 전체 목록을 처리할 수도 있습니다.

pax> false | true | false; echo ${PIPESTATUS[*]}
1 0 1

파이프라인에서 가장 큰 오류 코드를 가져오려면 다음과 같은 방법을 사용할 수 있습니다.

true | true | false | true | false
rcs=${PIPESTATUS[*]}; rc=0; for i in ${rcs}; do rc=$(($i > $rc ? $i : $rc)); done
echo $rc

해서 하게 됩니다.PIPESTATUS 「」, 「」에 합니다.rc의 것 the rcdiscloss.discloss 。

<고객명>과 함께 작업하는 $? 명령어$?아, 네, 네, 네, 네.즉, 파이프라인을 실행하면 파이프라인에 있는 마지막 프로세스의 종료 코드만 얻을 수 있습니다.

또 다른 접근방식은 다음과 같습니다.

set -e
set -o pipefail

이것을 셸 스크립트의 맨 위에 두면 Bash가 대신 처리해 줄 것 같습니다.이전 포스터에서 설명한 바와 같이 "set - e"를 사용하면 Bash가 종료되고 모든 간단한 명령에서 오류가 발생합니다."set -o pipefail"을 지정하면 파이프라인 내 명령어에서도 오류가 발생하며 Bash가 종료됩니다.

이 문제에 대한 자세한 내용은 여기를 참조하거나 여기참조하십시오.다음 섹션은 의 Bash 매뉴얼입니다.set빌트인

set -e'이렇게 하다'프로그램의 어떤 명령어보다 먼저 입력해 주세요.

파라미터 없이 Bash에서 exit만 호출하면 마지막 명령어의 exit 코드가 반환됩니다.의의합과 ORBash는 이전 명령어가 실패했을 경우에만 exit을 호출해야 합니다.하지만 난 이걸 테스트해 본 적이 없어.

command1 | | exit;
command2 | | exit;

또한 Bash는 마지막 명령의 종료 코드를 변수에 저장합니다.$?.

[ $? -eq 0 ] || exit $?; # Exit for nonzero return code

http://cfaj.freeshell.org/shell/cus-faq-2.html#11

  1. 의 종료 코드를 입수하려면 어떻게 해야 합니까?cmd1cmd1|cmd2

    먼저 주의해 주세요.cmd1exit 코드는 0이 아닐 수 있지만 오류를 의미하지는 않습니다.예를 들어 이 문제는

    cmd | head -1
    

    141(또는 ksh93)의 종료 상태가 표시되는 경우가 있습니다.cmd1하지만 그 이유는cmdSIGPIPE 신호에 의해 중단되었습니다.head -1한 줄을 읽은 후 종료됩니다.

    파이프라인 요소의 종료 상태를 확인하려면cmd1 | cmd2 | cmd3

    a. Z 쉘 포함(zsh):

    종료 코드는 pipestatus 특수 배열로 제공됩니다. cmd1종료 코드가 입력되어 있습니다.$pipestatus[1],cmd3종료 코드$pipestatus[3],하도록$?항상 똑같다$pipestatus[-1].

    b. Bash와 함께:

    종료 코드는 에 기재되어 있습니다.PIPESTATUS특수 어레이 cmd1는 종종코코 is is is is is is exit exit exit에 있습니다.${PIPESTATUS[0]},cmd3「」의 ${PIPESTATUS[2]}$? ${PIPESTATUS: -1}.

    ...

    자세한 내용은 Z 쉘을 참조하십시오.

Bash의 경우:

# This will trap any errors or commands with non-zero exit status
# by calling function catch_errors()
trap catch_errors ERR;

#
# ... the rest of the script goes here
#

function catch_errors() {
   # Do whatever on errors
   #
   #
   echo "script aborted, because of errors";
   exit 0;
}

부쉬하다냥냥 just just just 로 묶기만 하면 .&&:

command1 && command2 && command3

다음과 같은 경우 중첩을 사용할 수도 있습니다.

if command1
   then
       if command2
           then
               do_something
           else
               exit
       fi
   else
       exit
fi
#
#------------------------------------------------------------------------------
# purpose: to run a command, log cmd output, exit on error
# usage:
# set -e; do_run_cmd_or_exit "$cmd" ; set +e
#------------------------------------------------------------------------------
do_run_cmd_or_exit(){
    cmd="$@" ;

    do_log "DEBUG running cmd or exit: \"$cmd\""
    msg=$($cmd 2>&1)
    export exit_code=$?

    # If occurred during the execution, exit with error
    error_msg="Failed to run the command:
        \"$cmd\" with the output:
        \"$msg\" !!!"

    if [ $exit_code -ne 0 ] ; then
        do_log "ERROR $msg"
        do_log "FATAL $msg"
        do_exit "$exit_code" "$error_msg"
    else
        # If no errors occurred, just log the message
        do_log "DEBUG : cmdoutput : \"$msg\""
    fi

}

언급URL : https://stackoverflow.com/questions/90418/exit-shell-script-based-on-process-exit-code

반응형