-
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!"
와 같이 해 주면 되는 것이었습니다.
어느 분께는 도움이 되셨기를...