728x90
반응형

셸 스크립트(Shell Script)에서의 에러 핸들링은 직전에 실행된 명령어의 종료 상태(exit status)를 반환하는 변수인 「$?」를 통해 간단하게 처리할 수 있다. 

『 $? 란 - 셸(Shell)에서 직전에 실행된 명령어의 종료 상태(exit status) 확인 방법 

 

 

◆ 에러 핸들링


일반적으로 「$?」는 직전에 실행된 명령어에 대한 종료코드 번호가 반환되는데, 성공 시에는「0」, 실패 시에는「0」이외의 값이 반환되기 때문에 조건문에서 이점을 활용하여 에러를 핸들링할 수 있다.

test -f /file/temp.txt # 파일 존재 여부 확인
result=$? # 종료상태값 저장

if [ ${result} -eq 0 ]; then
    # 상태 코드가 0이면 정상 완료에 따른 처리 진행
else
    # 상태 코드가 0이 아니면 에러처리 진행
fi

위 예제에서는 동작에 대한 종료코드를 result라는 변수에 담아둔 뒤 조건문에서 성공 여부를 판단하는데 활용하고 있다.

만약, 결과를 변수에 담아둔 뒤 나중에 활용할게 아니라면 아래 예제와 같이 바로 결과에 대한 처리를 하는 방법도 가능하다.

test -f /file/temp.txt && echo "정상 처리" || echo "에러 처리"

 

 

◆ 종료코드


종료코드 번호가 반환값이 0 이면 성공0 이외는 실패를 의미한다.

종료코드 번호 의미 예제 비고
0 성공   명령이나 프로그램이 오류 없이 성공적으로 실행됨
1 일반적인 에러 let "var1 = 1/0" "0으로 나누기" 및 기타 허용되지 않는 연산과 같은 기타 오류
2 쉘 내장 명령어의 잘못된 사용 empty_function() {} 키워드 또는 명령어가 누락된 경우
126 실행할수 없는 명령어 호출 /dev/null 권한 문제 또는 실행 명령이 아닌 경우
127 "command not found" illegal_command $PATH에 문제가 있거나 명령어에 오타가 있는 경우
128 잘못된 종료인자를 넘김 exit 3.14159 exit는 0~255 범위의 정수 인자만 받음
128 + n 치명적 에러 시그널 "n" 스크립트의  $PPID를 kill -9 $?는 137(128+9)을 반환
130 스크립트가 Control-C로 종료됨 Ctrl-C Control-C 는 치명적 에러 시그널 2번 (130 = 128 + 2, 바로 위 참고)
255 종료 상태 범위 초과 exit -1 exit는 0~255 범위의 정수 인자만 받음

 

 

참조
Bash exit codes with special meanings
https://access.redhat.com/solutions/196563

글 내용 중 잘못된 부분이 있거나, 첨부하실 내용이 있으시면 댓글로 남겨주세요. 공부하는데 많은 도움이 됩니다.
-- 기억의 유효기간은 생각보다 짧다. --

 

728x90
반응형