Linux Bash Shell 스크립트 에러 발생시 종료 하기
    - 리눅스 스크립트 파일에서 명령 도중에 에러 발생시 자동으로 실행 종료하는 방법

//-------------------------------------
< 방법 1 >

다음 행을 추가
set -e


//-------------------------------------
단점
명령이 0으로 끝나야만 에러가 없는 것으로 판단
문제 상황 예시 : git commit 가 커밋할 내용없음(nothing to commit)을 리턴하면, 에러로 판단되어서 실행이 중단됨


//-------------------------------------
< 방법 2 >
    - 실행 결과 메시지 문자열에서 특정 문자열이 있는지 비교

# 결과 문자열
OUT=$(명령>&1)

STR1='체크1'
STR2='체크2'

# 주의!! [[ 와 띄어쓰기 중요
if [[ "$OUT" == *"$STR1"* ]] || [[ "$OUT" == *"$STR2"* ]];  then
    echo "찾음 처리"
else
    echo "못찾음 처리"
fi

//-------------------------------------
주의! 실행 결과 메시지가 캡쳐 안되는 경우도 있음
    - 캡쳐 안되는 예) git commit에서 정상 종료(file changed) 메시지는 캡쳐 안됨
            - commit , rebase 처럼 다른 에디터 프로그램을 거처서 결과가 출력되는 경우 캡쳐 안됨

    - 캡쳐 되는 예) commit 에서  커밋할 내용 없음('nothing to commit')  은 결과가 캡쳐됨 - 다른 프로그램을 거치 않음

 


    - 캡쳐안되는 문제 해결 방법 : 파이썬(python)에서는 모두 캡쳐 가능
subprocess.run("git commit", capture_output=True)

 

    //-------------------------------------

    주의! getstatusoutput()는 한글 코드관련 에러 발생

        UnicodeDecodeError: 'cp949' codec can't decode byte 0x80 in position 26: illegal multibyte sequence

 

        - 해결방법 : encoding 옵션 추가, 

subprocess.run("git commit", capture_output=True, encoding="unicode_escape") 

 

 

            - utf-8코드는 에러 발생 : UnicodeDecodeError: 'utf-8' codec can't decode byte  in position  invalid start byte 

 


//-------------------------------------
// 참고
https://stackoverflow.com/questions/2870992/automatic-exit-from-bash-shell-script-on-error

How to Check if a String Contains a Substring in Bash
https://linuxize.com/post/how-to-check-if-string-contains-substring-in-bash/



//-----------------------------------------------------------------------------
windows batch file 에러 발생시 종료 하기
    - dos 배치 스크립트(script) 파일에서 명령 도중에 에러 발생시 자동으로 실행 종료하는 방법

//-------------------------------------
< 방법 1 >

명령행 다음에 다음을 추가
if %errorlevel% neq 0 exit /b %errorlevel%


//-------------------------------------
< 방법 2 >

명령  || goto :error

:; exit 0
exit /b 0

:error
exit /b %errorlevel%


//-------------------------------------
단점
명령이 0으로 끝나야만 에러가 없는 것으로 판단
문제 상황 예시 : git commit 가 커밋할 내용없음을 리턴하면 에러로 판단
    - 여러 에러 리턴값( %errorlevel% )이 모두 1


//-------------------------------------
// 참고
https://stackoverflow.com/questions/734598/how-do-i-make-a-batch-file-terminate-upon-encountering-an-error

반응형
Posted by codens