개요

 

안녕하세요 피터입니다.

오늘은 Bash 쉘에서 프로그램을 종료(exit) 하는 방법과 종료 상태(exit status)를 얻는 방법에 대해 설명드리겠습니다.

종료 상태는 리턴값(return value, return status)이라고 부르기도 하는데 이전에 수행했던 명령어나 프로그램이 종료 될 때 넘겨주는 값을 의미하기도 해서 그렇습니다.

 

종료 상태 또는 반환값이 중요한 이유는 쉘 스크립트를 작성하는데 있어서 특정 명령어의 성공 여부에 따라 분기해야 하는 경우 이전 명령어가 정상적으로 수행되었는지 아는 것이 필수적이기 때문입니다.

 

쉘 스크립트 내에서 exit 명령어가 실행되면 스크립트가 종료되며 부모 프로세스에 종료 상태를 전달할 수 있는데 이 값은 프로그램 내에서 임의로 지정할 수도 있습니다. 

 

이렇게 전달되는 하위 프로세스의 종료 상태는 스크립트를 자동화하는데 있어서 매우 중요한 기준을 제공합니다. 

(일반적으로 명령어의 종료 상태가 0이면 성공(success)로 판단하며 오류가 있는 경우 오류 코드를 반환하게 됩니다)

 

 

종료 (exit)

 

exit 명령어는 매개변수로 주어진 값을 리턴합니다. 

#!/bin/bash

echo "hello"

exit 100

 

예를들면 위와 같이 exit 100 이라고 작성하면 스크립트를 종료하면서 100 이라는 값을 리턴하는 것이죠.

이 때 종료 상태로 사용할 수 있는 값의 범위는 0 부터 255 까지입니다. 

일반적으로 unix 관행을 잘 따르는 경우 0은 성공, 1 ~ 255 는 오류 코드(error code)로 인식되고 있습니다. 

 

만일 exit 를 매개변수 없이 사용하게 되면 exit 가 실행되기 이전에 가장 마지막으로 수행됐던 명령어의 종료 상태를 반환하게 됩니다.

 

 

종료 상태 (exit status)

 

$? 는 가장 최근 명령어의 종료 상태를 나타냅니다. 

위 스크립트가 100을 반환한다고 했는데 정말 그런지 실행 후 종료 상태를 출력해보겠습니다.

 

[root@peterdev sh]# cat test.sh
#!/bin/bash

echo "hello"

exit 100
[root@peterdev sh]# sh test.sh
hello
[root@peterdev sh]# echo $?
100

 

위와 같이 echo $? 명령어에서 100이 출력되는 것을 확인할 수 있습니다.

 

만일 잘못된 명령어를 입력하여 오류가 발생한 경우는 아래와 같이 오류코드가 반환되는 것을 확인할 수 있습니다.

[root@peterdev sh]# eeee
-bash: eeee: command not found
[root@peterdev sh]# echo $?
127

 

아래 스크립트에서는 echo "hello" 가 정상적으로 수행되었기 때문에 0이 반환된 것을 확인할 수 있습니다.

[root@peterdev sh]# echo "hello"
hello
[root@peterdev sh]# echo $?
0

 

 

-Peter의 우아한 프로그래밍

여러분의 공감과 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 남겨주시면 감사하겠습니다.

 

 

블로그 이미지

친절한 Peter Ahn

IT 정보 공유, 프로그래밍 지식 공유

댓글을 달아 주세요

  • tykim 2021.10.22 11:00  댓글주소  수정/삭제  댓글쓰기

    감사합니다 덕분에 자동화에 도움이 되었습니다.
    질문이 있는데요,

    제가 실행한 명령어가 끝났는지 알려면 echo "$?" 로 알 수 있다고 하셨는데

    만일 실행한 명령어가 수행에 다소 시간이 걸린다면 $? 값은 명령어가 모두 끝나고 나서야 할당 될까요?

    예를들어,
    용량이 큰 test_dir 을 압축할 경우에
    zip test_dir 을 수행하고
    echo $? 를 수행한다면

    $?에 할당된 값이 0일 때, 단순히 zip 명령어가 수행이 된걸까요, 아니면 압축 실행이 모두 끝났다는 것일까요?

    감사합니다.