[sh] 쉘스크립트에서 성공여부 확인 방법 Develop Tip


쉘스크닙트를 작성하다 보면 특정 명령의 성공 유무가 궁금합니다.

이것은 해당 Process의 return 값하고 관계가 있을 수 있는데
C 프로그램의 main() 함수에서의 return 값 하고도 관계가 있습니다.
혹은 python 에서의 sys.exit(9) 같은 것과도 동일합니다.

모두 동일한데 0 이 리턴되면 정상이고 0이 리턴되지 않으면
오류로 간주합니다.

예를 들어

ls /etc | grep hosts

라는 명령을 실행하면

$ ls /etc | grep hosts
hosts
hosts.allow
hosts.deny


와 같은 결과가 나오고

$ echo $?
0

와 같이 이전 실행명령의 리턴값 ($?) 을 찍어보면 0 으로써 성공했다는 것이 나옵니다.

ls /etc 에 파일이나 폴더 목록을 보면서 hosts 라는 것이 있는 가를 grep 해본 결과입니다.

이제 host 대신 h_ost 라는 것을 대신 해 보면,

$ ls /etc | grep h_osts
$ echo $?
1


와 같이 0 이 아닌 값이 나옵니다.

이것을 기본적인 shell 스크립트로 만들어 본다면,

#!/bin/sh
ls /etc | grep h_osts
if [ $? -eq 0 ];then
    echo "CMD OK!"
else
    echo "CMD Failure!"
    exit 9
fi
echo "After CMD OK!"

위와 같이 만들 수 있습니다.

그런데 더 간단하게 보이는 방법으로서
명령을 실행하고 나서 쉘의 && || 논리 연산자를 이용하는 방법이 있습니다.

ls /etc | grep h_osts && echo "CMD OK!" || echo "CMD Failure!"

와 같이

CMD && 성공인경우의명령 || 실패인 경우의명령

과 같이 한줄로 표현 가능합니다. 물론 가독성을 위하여

ls /etc | grep h_osts \
    && echo "CMD OK!" \
    || echo "CMD Failure!"; exit 9
echo "After CMD OK!"

와 같이 줄 수 있습니다. (처음에는 적어도 그렇게 생각했지요) 

이것은 sh (bash 도 동일)의 논리 연산자의 실행 최적화와 관계 있는데요,

조건식 && 결과1 || 결과2

와 같은 구문이 있다고 하였을 때
조건식이 True 이면 && 다음 구문까지 확인하여 마저 True인가를 확인하지만 이미 True이기 때문에 && 다음의 결과1은 실행시키지만, || 다음의 결과2 구문은 실행시키지 않습니다.
조건식이 False 이면 그 반대로 || 다음의 결과2 구문만 실행합니다.

그런데 위의 명령을 수행하면 성공 하던 안하던 간에 무조건 exit 9으로 종료를 해 버렸습니다.

생각해보니 
명령1 && 명령2 || 명령3
이 하나의 명령이고 그것에 이어 (';') exit 9 명령이 수행되기 때문입니다.

여기서는 위의 명령3을 exit 9 까지 하나로 묶어 처리해야 합니다.

결론은,

ls /etc | grep h_osts \
    && echo "CMD OK!" \
    || echo "CMD Failure!"; exit 9; }
echo "After CMD OK!"

와 같이 해 주면 되는 것이었습니다.

어느 분께는 도움이 되셨기를...

덧글

  • 고마워요 2017/10/20 18:46 # 삭제 답글

    마침 딱 찾고이던 내용이 너무 잘정리 되어있네요.. 잘 보고 갑니다.!
  • 지훈현서아빠 2017/10/23 14:09 #

    도움이 되셨다니 저의 보람입니다~ ^^
  • 123123 2019/05/22 18:02 # 삭제 답글

    정말 잘보고갑니다!
  • 지훈현서아빠 2019/05/22 20:01 #

    도움이 되셨다니 저의 보람입니다~ ^^
댓글 입력 영역

구글애드텍스트