programing

Bash 스크립트에서 특정 상황이 발생했을 때 스크립트 전체를 종료하려면 어떻게 해야 합니까?

easyjava 2023. 4. 9. 22:32
반응형

Bash 스크립트에서 특정 상황이 발생했을 때 스크립트 전체를 종료하려면 어떻게 해야 합니까?

코드를 테스트하기 위해 Bash로 스크립트를 작성하고 있습니다.단, 코드 컴파일에 실패했을 경우 테스트를 실행하는 것은 어리석은 일이며, 이 경우 테스트를 중단합니다.

스크립트 전체를 루프로 감싸고 휴식 시간을 사용하지 않고 이 작업을 수행할 수 있는 방법이 있습니까? 던 던 고토 같은 거요?

다음 문장을 사용해 보십시오.

exit 1

1적절한 에러 코드를 지정합니다.특별한 의미가 있는 종료 코드」

set -e 사용

#!/bin/bash

set -e

/bin/command-that-fails
/bin/command-that-fails2

스크립트는 첫 번째 행이 실패하면 종료됩니다(0이 아닌 종료 코드를 반환합니다).이 경우 명령어 that-fails2는 실행되지 않습니다.

모든 명령어의 반환 상태를 체크하는 경우 스크립트는 다음과 같습니다.

#!/bin/bash

# I'm assuming you're using make

cd /project-dir
make
if [[ $? -ne 0 ]] ; then
    exit 1
fi

cd /project-dir2
make
if [[ $? -ne 0 ]] ; then
    exit 1
fi

set -e를 사용하면 다음과 같이 됩니다.

#!/bin/bash

set -e

cd /project-dir
make

cd /project-dir2
make

명령어가 실패하면 스크립트 전체가 실패하고 $로 확인할 수 있는 종료 상태가 반환됩니다.스크립트가 매우 길거나 많은 것을 빌드하고 있는 경우, 모든 곳에 반환 상태 체크를 추가하면 매우 곤란해집니다.

SysOps 직원이 세 손가락 발톱 기술을 가르쳐 준 적이 있습니다.

yell() { echo "$0: $*" >&2; }
die() { yell "$*"; exit 111; }
try() { "$@" || die "cannot $*"; }

*NIX OS のnnnnnnnnnnn 。 안 쓰든.try()을 사용법

설명.

(날으는 양의 코멘트에 근거합니다).

  • yell: 및 모든 : 스립트 : to to to : 。stderr다음과 같습니다.
    • $0스크립트의 입니다.
    • $*모두 인수입니다.
    • >&2stdout을 & pipe로 리다이렉트하는 것을 의미합니다.파이프는 다음과 같습니다.stdout그 자체입니다.
  • die 을 하다yell단, 0이 아닌 종료상태로 종료됩니다.즉, "실패"입니다.
  • try는 을 합니다.|| (비밀(이행)OR왼쪽이 고장났을 경우에만 오른쪽이 평가됩니다.
    • $@모두 다른 주장입니다.

「」를 사용해 를 source , 을 사용하면 .return <x>서 ''는<x>스크립트 종료 상태가 됩니다(오류 또는 false의 경우 0이 아닌 값을 사용합니다).그러나 실행 가능한 스크립트(즉, 파일 이름을 사용하여 직접 실행)를 호출하면 리턴 스테이트먼트에 불만이 발생합니다(오류 메시지 "return: can only 'return' from function or source script").

ifexit <x>이 될 때 됩니다.source스크립트를 시작한 셸은 종료되지만 실행 가능한 스크립트는 예상대로 종료됩니다.

같은 스크립트로 어떤 케이스도 처리하려면

return <x> 2> /dev/null || exit <x>

이것은 적절한 호출을 처리할 수 있습니다.즉, 이 스테이트먼트를 스크립트의 최상위 레벨로 사용하는 것을 전제로 하고 있습니다.함수 내에서 스크립트를 직접 종료하지 않는 것이 좋습니다.

★★★★★★<x>숫자에 불과해야 합니다.

오류를 처리하기 위해 run()이라는 함수를 포함하는 경우가 많습니다.발신하는 모든 콜이 이 함수에 전달되므로 장애가 발생하면 스크립트 전체가 종료됩니다.set -e 솔루션보다 이 기능의 장점은 회선에 장애가 발생해도 스크립트가 자동으로 종료되지 않고 문제가 무엇인지 알 수 있다는 것입니다.다음 예제에서는 스크립트가 false 콜에서 종료되기 때문에 세 번째 행은 실행되지 않습니다.

function run() {
  cmd_output=$(eval $1)
  return_value=$?
  if [ $return_value != 0 ]; then
    echo "Command $1 failed"
    exit -1
  else
    echo "output: $cmd_output"
    echo "Command succeeded."
  fi
  return $return_value
}
run "date"
run "false"
run "date"

if다음과 같이 단락 평가를 활용할 수 있습니다.

#!/usr/bin/env bash

echo $[1+1]
echo $[2/0]              # division by 0 but execution of script proceeds
echo $[3+1]
(echo $[4/0]) || exit $? # script halted with code 1 returned from `echo`
echo $[5+1]

교대 연산자의 우선 순위 때문에 필요한 괄호 쌍에 유의하십시오. $?는 최근 호출된 명령어의 코드를 종료하기 위한 특수 변수입니다.

같은 질문이 있습니다만, 중복이 되기 때문에 질문할 수 없습니다.

exit을 사용하면 스크립트가 좀 더 복잡해지면 받아들여진 답변은 기능하지 않습니다.백그라운드 프로세스를 사용하여 상태를 확인할 경우 하위 쉘에서 실행되므로 해당 프로세스만 종료하십시오.스크립트를 종료하려면 명시적으로 스크립트를 종료해야 합니다(적어도 내가 아는 유일한 방법임).

다음은 그 방법에 대한 간단한 스크립트입니다.

#!/bin/bash

boom() {
    while true; do sleep 1.2; echo boom; done
}

f() {
    echo Hello
    N=0
    while
        ((N++ <10))
    do
        sleep 1
        echo $N
        #        ((N > 5)) && exit 4 # does not work
        ((N > 5)) && { kill -9 $$; exit 5; } # works 
    done
}

boom &
f &

while true; do sleep 0.5; echo beep; done

이게 더 나은 답이지만 아직 미완성인 는 붐 파트를 어떻게 없애야 할지 정말 모르겠다.

다음과 같은 방법으로 프로그램 이름별로 프로그램을 닫을 수 있습니다.

부드러운 출구용

pkill -9 -x programname # Replace "programmname" by your programme

어려운 출구를 위해

pkill -15 -x programname # Replace "programmname" by your programme

프로그램 종료 조건을 평가하는 방법을 알고 싶다면 질문을 사용자 정의해야 합니다.

#!/bin/bash -x

# exit and report the failure if any command fails
exit_trap () {                                         # ---- (1)
  local lc="$BASH_COMMAND" rc=$?
  echo "Command [$lc] exited with code [$rc]"
}

trap exit_trap EXIT                                    # ---- (2)

set -e                                                 # ---- (3)

설명:

이 질문은 클린 코드를 작성하는 방법에 대한 질문이기도 합니다.위의 스크립트를 여러 부분으로 나눕니다.


: 트 - 1:exit_trap때하는 함수입니다.$BASH_COMMAND는, 그 순서의 리턴 코드를 캡쳐 합니다.이것은 셧다운 훅과 마찬가지로 청소에 사용할 수 있는 기능입니다.

트랩의 결과로서 셸이 명령어를 실행하고 있지 않는 한, 현재 실행 중이거나 실행하려고 하는 명령어.이 경우 트랩 시에 실행되는 명령어입니다.

의사 선생님.


파트 - 2:

trap [action] [signal]

트랩 액션을 등록합니다(여기서).exit_trap기능) EX의 경우IT 신호


파트 - 3:

하나 이상의 명령 시퀀스가 0이 아닌 상태를 반환할 경우 즉시 종료합니다.실패한 명령어가 키워드 직후 또는 키워드까지 명령어목록의 일부, if 문의 테스트의 일부, &/ 또는 | 목록 내의 명령어 중 최종 &/ 또는 | 뒤의 명령어를 제외하고 &/ 또는 | 목록에서 실행되는 명령어의 일부일 경우 파이프라인의 모든 명령어가 종료되지 않습니다.또는 명령어 반환 상태가 !로 반전되는 경우.-e가 무시되는 동안 명령이 실패했기 때문에 하위 셸 이외의 복합 명령이 0이 아닌 상태를 반환하는 경우 셸은 종료되지 않습니다.ERR 트랩이 설정되어 있는 경우 셸이 종료되기 전에 실행됩니다.

의사 선생님.


파트 - 4:

작성할 수 있습니다.common.sh모든 스크립트에 파일을 저장하고 소스합니다.

source common.sh

언급URL : https://stackoverflow.com/questions/1378274/in-a-bash-script-how-can-i-exit-the-entire-script-if-a-certain-condition-occurs

반응형