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
'programing' 카테고리의 다른 글
| 빌드 시 명령 복사본이 코드 4와 함께 종료됨 - Visual Studio 재시작으로 해결 (0) | 2023.04.09 |
|---|---|
| 목록에서 목록으로 캐스팅하기 위한 더 짧은 구문? (0) | 2023.04.09 |
| UITableView - 섹션 헤더 색상 변경 (0) | 2023.04.09 |
| Excel VBA에서 변경된 셀의 이전 값을 얻으려면 어떻게 해야 합니까? (0) | 2023.04.09 |
| 셸 스크립트에서 하위 문자열 하나를 다른 문자열로 바꿉니다. (0) | 2023.04.09 |