programing

명령이 실패하면 어떻게 종료합니까?

yellowcard 2023. 4. 25. 22:15
반응형

명령이 실패하면 어떻게 종료합니까?

저는 조개껍데기 대본에 능통합니다.메시지를 인쇄하고 명령이 실패하면 스크립트를 종료하려고 합니다.노력했습니다.

my_command && (echo 'my_command failed; exit)

하지만 효과가 없습니다.스크립트의 다음 줄에 따라 명령이 계속 실행됩니다.Ubuntu랑 bash를 쓰고 있어요.

시도해 보십시오.

my_command || { echo 'my_command failed' ; exit 1; }

네 가지 변경 사항이 있습니다.

  • 바꾸다&&로.||
  • 사용하다{ }대신해서( )
  • 소개하다;끝나고exit그리고.
  • 뒤에 공백이 있습니다.{그리고 그 전에요}

명령이 실패할 때만 메시지를 인쇄하고 종료하려면(값이 0이 아닌 종료) 다음 메시지가 필요합니다.||한 번도요&&.

cmd1 && cmd2

실행할 것입니다.cmd2언제cmd1successs(예: 값)입니다.0). 어디인지 확인합니다.

cmd1 || cmd2

실행할 것입니다.cmd2언제cmd1fails(0이 아닌 값)입니다.

사용.( )내부 명령을 하위 쉘로 실행하고 호출합니다.exit그러면 원래 셸이 아닌 하위 셸이 종료되므로 원래 셸에서 실행이 계속됩니다.

이 용도를 극복합니다.{ }

마지막 두 변경 사항은 bash에 필요합니다.

다른 답변에서는 직접 질문을 잘 다루었지만, 사용에도 관심이 있을 수 있습니다.set -e. 이렇게 하면 다음과 같은 특정 컨텍스트를 벗어나면 모든 명령이 실패합니다.iftests)를 선택하면 스크립트가 중단됩니다.특정 스크립트의 경우 매우 유용합니다.

스크립트의 모든 명령에 대해 이 동작을 수행하려면 다음을 추가하십시오.

set -e 
set -o pipefail

스크립트 시작 부분에 있습니다.이 옵션 쌍은 명령이 0이 아닌 종료 코드로 반환될 때마다 bash 인터프리터를 종료하도록 지시합니다. 자세한 이유는 다음과 같습니다.pipefail필요한 경우 http://petereisentraut.blogspot.com/2010/11/pipefail.html)를 참조하십시오.

그러나 종료 메시지를 인쇄할 수는 없습니다.

또한 각 명령의 종료 상태는 셸 변수 $?에 저장되며, 명령을 실행한 후 바로 확인할 수 있습니다.0이 아닌 상태는 실패를 나타냅니다.

my_command
if [ $? -eq 0 ]
then
    echo "it worked"
else
    echo "it failed"
fi

저는 다음과 같은 숙어를 개발했습니다.

echo "Generating from IDL..."
idlj -fclient -td java/src echo.idl
if [ $? -ne 0 ]; then { echo "Failed, aborting." ; exit 1; } fi

echo "Compiling classes..."
javac *java
if [ $? -ne 0 ]; then { echo "Failed, aborting." ; exit 1; } fi

echo "Done."

각 명령 앞에 정보 에코를 붙이고, 각 명령 앞에 같은 에코를 붙입니다.
if [ $? -ne 0 ];...줄. (물론 원하는 경우 오류 메시지를 편집할 수 있습니다.)

제공되었습니다.my_command규범적으로 설계되었습니다. 즉, 성공하면 0을 반환합니다.&&이겁니다.갖고 싶다고요?||요.

그리고 이 때 주의해 주세요.(배쉬할 때는 옳지 않은 것 같지만, 제가 있는 곳에서는 시도할 수 없어요.말해줘.

my_command || {
    echo 'my_command failed' ;
    exit 1; 
}

또한 종료 오류 상태를 유지하고 한 줄에 하나의 명령으로 읽을 수 있는 파일이 있는 경우 다음을 사용할 수 있습니다.

my_command1 || exit
my_command2 || exit

그러나 이렇게 해도 추가 오류 메시지가 인쇄되지 않습니다.그러나 실패한 명령에 의해 오류가 인쇄되는 경우도 있습니다.

»는 다음과 같습니다.trap셸 빌트인을 사용하면 신호 및 실패한 명령 실행(즉, 0이 아닌 반환 상태)을 비롯한 기타 유용한 조건을 포착할 수 있습니다.따라서 모든 명령어의 반환 상태를 명시적으로 테스트하고 싶지 않은 , 이 명령어의 반환 상태를 명시적으로 테스트하지 않을 수 있습니다.trap "your shell code" ERR명령이 0이 아닌 상태를 반환할 때마다 셸 코드가 실행됩니다.이겁니다.

trap "echo script failed; exit 1" ERR

한 명령을 잡는 다른 사례와 마찬가지로 파이프라인도 특별한 처리가 필요합니다. 위의 명령어는 수신되지 않습니다. 이겁니다.false | true요.

용용을 사용합니다.exit스크립트가 다른 장소(예: 터미널)에서 제공될 수 있으므로 직접 다루기 어려울 수 있습니다.대신 부조각을 사용하는 것이 좋습니다.set -e게다가 오류는 cout이 아닌 cerr로 들어가야 합니다.) :(cout이 아닌 cerr로 들어갑니다.)

set -e
ERRCODE=0
my_command || ERRCODE=$?
test $ERRCODE == 0 ||
    (>&2 echo "My command failed ($ERRCODE)"; exit $ERRCODE)

언급URL : https://stackoverflow.com/questions/3822621/how-to-exit-if-a-command-failed 입니다.

반응형