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
'Code' 카테고리의 다른 글
리눅스 보안 SELinux , AppArmor 비교 (0) | 2021.07.12 |
---|---|
이메일 전송 서버 운영시 사이트에서 수신을 거부하는 문제 해결 방법 (0) | 2021.07.12 |
[Linux] apt 패키지, 저장소 사용법 (0) | 2021.07.02 |
우분투 리눅스 시스템 업그레이드(LTS) (0) | 2021.07.01 |
[오라클 클라우드] 컴퓨트 서버 포트 허용 설정 방법 (0) | 2021.06.20 |