exit 0 exit 1 :: 에버노트

ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • exit 0 exit 1
    카테고리 없음 2018. 9. 11. 17:06

    # 출처 http://egloos.zum.com/mcchae/v/11221790

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

    이것은 해당 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!"

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

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


    댓글

Designed by Tistory.