답변:
시험:
my_command || { echo 'my_command failed' ; exit 1; }
네 가지 변경 사항 :
&&
에||
{ }
대신 사용( )
;
후 소개exit
{
및 이전}
당신이 메시지와 명령 (아닌 값으로 종료) 실패 할 경우에만 종료를 인쇄 할 때문에 당신은 필요가 ||
아닌를 &&
.
cmd1 && cmd2
성공하면 실행 cmd2
됩니다 cmd1
(exit value 0
). 어디로
cmd1 || cmd2
실패하면 실행 cmd2
됩니다 cmd1
(종료 값이 0이 아님).
를 사용 ( )
하면 내부 명령이 하위 셸 에서 실행되고 exit
거기에서 a 를 호출하면 원래 셸이 아닌 하위 셸이 종료되므로 원래 셸에서 계속 실행됩니다.
이 사용을 극복하기 위해 { }
마지막 두 가지 변경 사항은 bash에 필요합니다.
{ (>&2 echo 'my_command failed') ; exit 1; }
다른 답변은 직접 질문을 잘 다루었지만을 사용하는 데 관심이있을 수 있습니다 set -e
. 이를 통해 if
테스트 와 같은 특정 컨텍스트 이외의 명령이 실패 하면 스크립트가 중단됩니다. 특정 스크립트의 경우 매우 유용합니다.
set -e
그것이 작동하는 시간과 작동하지 않는 시간에 대한 길고 비전적인 규칙을 가지고 있습니다. (사람이 실행되면 if yourfunction; then ...
, 다음 set -e
화재 내부 결코 yourfunction
그 코드를 고려하거나 호출 무엇 때문에 "확인"). BashFAQ # 105의 연습 섹션을 참조 하여 이것과 다른 함정에 대해 논의하십시오 (일부는 특정 쉘 버전에만 적용되므로 스크립트를 실행하는 데 사용할 수있는 모든 릴리스에 대해 테스트해야합니다).
또한 각 명령의 종료 상태는 셸 변수 $?에 저장되며 명령 실행 후 즉시 확인할 수 있습니다. 0이 아닌 상태는 실패를 나타냅니다.
my_command
if [ $? -eq 0 ]
then
echo "it worked"
else
echo "it failed"
fi
echo "Just finished step A"
그 것을 모르고 echo
덮어 $?
가는 나중에 검사 할 수 있습니다.
스크립트의 모든 명령에 대해 해당 동작을 원하면 추가하십시오.
set -e
set -o pipefail
스크립트의 시작 부분에. 이 옵션 쌍은 명령이 0이 아닌 종료 코드와 함께 리턴 될 때마다 bash 인터프리터에게 종료하도록 지시합니다.
그래도 종료 메시지를 인쇄 할 수 없습니다.
trap
bash 내장 명령을 사용하여 종료시 명령을 실행할 수 있습니다 .
set -o pipefail
원하는 동작이 아닐 수 있습니다. 지적 해 주셔서 감사합니다!
set -e
전혀 신뢰할 수 있고 일관성이 있거나 예측할 수있는 것은 아닙니다! 이를 확인하려면 BashFAQ # 105 의 연습 섹션 또는 in-ulm.de/~mascheck/various/set-e
다음 관용구를 해킹했습니다.
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 ];...
행을 사용하십시오. 물론 원하는 경우 해당 오류 메시지를 편집 할 수 있습니다.
if ! javac *.java; then ...
-왜 $?
전혀 귀찮게 ?
제공은 my_command
canonically, 설계 즉, 성공하면 그 다음, 0을 반환 &&
정확하게 당신이 원하는 것을 반대입니다. 당신은 원합니다 ||
.
또한 (
bash에서 나에게 옳지 않은 것처럼 보이지만 현재 위치에서 시도 할 수는 없습니다. 말해.
my_command || {
echo 'my_command failed' ;
exit 1;
}
종료 오류 상태를 유지하고 한 줄에 하나의 명령으로 읽을 수있는 파일이있는 경우에도 사용할 수 있습니다.
my_command1 || exit $?
my_command2 || exit $?
그러나 추가 오류 메시지는 인쇄되지 않습니다. 그러나 어떤 경우에는 실패한 명령으로 오류가 인쇄됩니다.
exit $?
. 단지 exit
사용하는 $?
기본 값으로.
trap
쉘 내부 명령 (즉, 0이 아닌 리턴 상태) 실패 명령 실행을 포함 잡기 신호 및 기타 유용한 조건을 수 있습니다. 따라서 모든 단일 명령의 반환 상태를 명시 적으로 테스트하지 않으려면 명령이 trap "your shell code" ERR
0이 아닌 상태를 반환 할 때마다 쉘 코드가 실행됩니다. 예를 들면 다음과 같습니다.
trap "echo script failed; exit 1" ERR
실패한 명령을 잡는 다른 경우와 마찬가지로 파이프 라인에는 특별한 처리가 필요합니다. 위는 잡을 수 없습니다 false | true
.