답변:
exit #
스크립트가 아닌 함수 안에 명령을 넣을 가능성이 높습니다 . (이 경우에 return #
대신 사용하십시오.)
exit 0
0 (이 성공이 스크립트의 결과를 사용할 수있는 다른 스크립트 이야기) 스크립트 반환을 종료
set -e 사용
#!/bin/bash
set -e
/bin/command-that-fails
/bin/command-that-fails2
스크립트는 실패한 첫 번째 줄 이후에 종료됩니다 (0이 아닌 종료 코드를 반환 함). 이 경우 command-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
실패한 명령은 전체 스크립트가 실패하고 $?로 확인할 수있는 종료 상태를 반환합니다 . . 스크립트가 너무 길거나 많은 것들을 만들고 있다면 어디에서나 리턴 상태 확인을 추가하면 꽤 추악해질 것입니다.
set -e
당신은 아직 할 수 있도록 몇 가지 스크립트를 중지하지 않고 오류가있는 명령 출구 : command 2>&1 || echo $?
.
set -e
파이프 라인 또는 명령 구조가 0이 아닌 값을 반환하면 스크립트를 중단합니다. 예를 들어 foo || bar
경우에만 모두 실패 foo
하고 bar
아닌 값을 반환합니다. 일반적으로 잘 작성된 bash 스크립트는 set -e
시작할 때 추가하고 추가는 자동 온 전성 검사 기능으로 작동합니다. 문제가 있으면 스크립트를 중단하십시오.
set -o pipefail
옵션 을 설정하여 명령이 실패하면 실패 할 수도 있습니다.
set -e
은 단지 것 make || exit $?
입니다.
한 SysOps 사람이 나에게 Three-Fingered Claw 기술을 가르쳐주었습니다.
yell() { echo "$0: $*" >&2; }
die() { yell "$*"; exit 111; }
try() { "$@" || die "cannot $*"; }
이 기능은 * NIX OS 및 쉘 풍미에 강합니다. 스크립트 시작 부분 (bash 또는 기타)에 배치하십시오.try()
문장과 코드를 넣으십시오.
( 비행 양 댓글을 기반으로 함 ).
yell
: 스크립트 이름과 모든 인수를 다음에 인쇄하십시오 stderr
.
$0
스크립트의 경로입니다.$*
모든 주장입니다. >&2
>
stdout을 & pipe로 리디렉션2
하는 것을 의미합니다 . 파이프1
stdout
자체 가 될 것입니다.die
와 동일 yell
하지만 0 이 아닌 종료 상태로 종료 됩니다. 이는 "실패"를 의미합니다.try
||
(boolean OR
)을 사용하는데 , 왼쪽이 실패한 경우에만 오른쪽을 평가합니다.
$@
다시 모든 인수이지만 다릅니다 .die() { yell "$1"; exit $2; }
메시지를 전달하고 종료 코드를 사용할 수 있도록 이것을 수정했습니다.die "divide by zero" 115
.
yell
및 die
. 그러나 try
그렇게 많지는 않습니다. 당신이 그것을 사용하는 예를 제공 할 수 있습니까?
로 스크립트를 호출하는 경우 스크립트 종료 상태가 될 위치 를 source
사용할 수 있습니다 (오류 또는 false에 0이 아닌 값 사용). 그러나 실행 가능한 스크립트를 호출하면 (예 : 파일 이름으로 직접) return 문에 문제가 발생합니다 ( "return : 함수 또는 소스 스크립트에서`return '만 할 수 있습니다"라는 오류 메시지).return <x>
<x>
경우 exit <x>
대신 사용되는 스크립트가 호출 될 때 source
,이 스크립트를 시작 쉘을 종료 될 것이다, 그러나 예상대로 실행 스크립트는 그냥 종료됩니다.
동일한 스크립트에서 두 경우 모두를 처리하기 위해
return <x> 2> /dev/null || exit <x>
이것은 어떤 호출이 적합한 지 처리합니다. 스크립트의 최상위 레벨에서이 문장을 사용한다고 가정합니다. 함수 내에서 스크립트를 직접 종료하지 않는 것이 좋습니다.
참고 : <x>
숫자 일뿐입니다.
나는 종종 오류를 처리하기 위해 run ()이라는 함수를 포함합니다. 내가 만들고자하는 모든 호출은이 함수로 전달되므로 오류가 발생하면 전체 스크립트가 종료됩니다. set -e 솔루션에 비해이 방법의 장점은 줄이 실패 할 때 스크립트가 자동으로 종료되지 않고 문제가 무엇인지 알려줄 수 있다는 것입니다. 다음 예제에서는 스크립트가 false를 호출 할 때 종료되므로 3 번째 행이 실행되지 않습니다.
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"
set -e option
. 그런 다음 명령에 인수가 포함되어 있으므로 괄호 문제를 피하기 위해 작은 따옴표를 사용했습니다 runTry 'mysqldump $DB_PASS --user="$DB_USER" --host="$BV_DB_HOST" --triggers --routines --events --single-transaction --verbose $DB_SCHEMA $tables -r $BACKUP_DIR/$tables$BACKUP_FILE_NAME'
. 참고 함수의 이름을 runTry로 변경했습니다.
eval
임의의 입력을 받아들이면 잠재적으로 위험하지만 그렇지 않으면 꽤 좋습니다.
구성 대신 단락 평가를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]
대체 연산자의 우선 순위로 인해 필요한 괄호 쌍에 유의하십시오. $?
가장 최근에 호출 된 명령의 코드를 종료하도록 설정된 특수 변수입니다.
command -that --fails || exit $?
괄호없이 작동에 대해 그것을 무엇 echo $[4/0]
우리가 그들을 필요로하는 그 원인은?
echo $[4/0] || exit $?
) bash는 을 실행하지 않습니다가 echo
, 혼자 순종하자 ||
.
나는 같은 질문을 가지고 있지만 중복 될 수 있기 때문에 요청할 수 없습니다.
스크립트가 조금 더 복잡하면 exit를 사용하여 허용 된 답변이 작동하지 않습니다. 백그라운드 프로세스를 사용하여 조건을 확인하는 경우 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
이것은 더 나은 대답이지만 여전히 불완전합니다 . 붐 부분을 제거하는 방법을 모르겠습니다 .
1
일관되게 사용할 수 있습니다 . 스크립트가 다른 스크립트에 의해 실행되는 경우 특정 의미로 고유 한 상태 코드 세트를 정의 할 수 있습니다. 예를 들어1
== 테스트 실패,2
== 컴파일 실패 스크립트가 다른 것의 일부인 경우, 스크립트가 사용 된 실습과 일치하도록 코드를 조정해야 할 수도 있습니다. 예를 들어 automake가 테스트 스위트의 일부를 실행77
하면 테스트를 건너 뛴 것으로 표시하는 데 코드 가 사용됩니다.