앞선 bash 입문 글에서 우리는 셸 스크립트 파일이 셸 인터프리터가 순차적으로 실행할 명령어 목록을 담고 있다는 것을 배웠습니다. 이번 글에서는 셸 명령어의 기본 구조와 내부 동작 원리, 그리고 명령어 실행 결과를 판단하는 핵심 요소인 종료 상태(Exit Status)에 대해 자세히 살펴보겠습니다.
셸 명령어란 무엇인가?
명령어(command)는 여러 단어의 나열입니다. 첫 번째 단어는 실행할 명령을 나타내며, 나머지 단어들은 해당 명령에 전달되는 인수(argument) 역할을 합니다. 인수에는 옵션(option)이나 매개변수(parameter)가 포함될 수 있습니다.
명령줄에서 일상적으로 사용하는 ls, lpr, grep 같은 유닉스 명령어들이 대표적인 셸 명령어입니다.
$ ls -alF $ lpr filename $ grep "string" filename
셸 명령어의 종료 상태(Exit Status)
명령어의 반환값(return value)은 곧 종료 상태를 의미합니다. 만약 명령이 시그널(signal) N에 의해 강제 종료되었다면, 반환값은 128 + N이 됩니다. 종료 상태는 명령 실행의 성공 여부를 판단하는 데 사용되며, 규칙은 다음과 같습니다.
- 종료 상태가 0이면 → 명령이 성공적으로 실행됨
- 종료 상태가 0이 아니면 → 명령 실행이 실패함
자주 사용되는 주요 종료 코드는 아래 표와 같습니다.
| 종료 값 | 종료 상태 의미 |
|---|---|
| 0 (영) | 성공 |
| 0이 아닌 값 | 실패 |
| 2 | 잘못된 사용법(Incorrect usage) |
| 126 | 실행 가능한 파일이 아님(Not an executable) |
| 127 | 명령어를 찾을 수 없음(Command Not found) |
$? 특별 셸 변수 활용하기
$?는 마지막으로 실행된 명령어의 종료 상태를 저장하는 특별한 내장 변수입니다. 이 변수를 활용하면 방금 실행한 명령이나 함수의 성공 여부를 즉시 확인할 수 있습니다.
- 셸 함수 실행 후:
$?는 함수 내부에서 마지막으로 실행된 명령어의 종료 상태를 반환합니다. - 셸 스크립트 실행 후:
$?는 스크립트 전체에서 마지막으로 실행된 명령어의 종료 상태를 반환합니다.
종료 상태를 확인하는 샘플 셸 스크립트
다음 exitstatus.sh 스크립트는 다양한 상황에서 발생하는 종료 상태를 한눈에 보여주는 예제입니다.
$ cat exitstatus.sh #! /bin/bash echo -e "Successful execution" echo -e "=====================" echo "hello world" # 위 명령은 성공했으므로 종료 상태는 0 echo "Exit status" $? echo -e "Incorrect usage" echo -e "=====================" ls --option # 잘못된 옵션 사용이므로 종료 상태는 2 echo "Exit status" $? echo -e "Command Not found" echo -e "=====================" bashscript # bashscript라는 명령이 없으므로 종료 상태는 127 echo "Exit status" $? echo -e "Command is not an executable" echo -e "=============================" ls -l execution.sh ./execution.sh # 실행 권한이 없는 파일이므로 종료 상태는 126 echo "Exit status" $?
이제 위 스크립트를 실제로 실행하면 각 상황별 종료 상태 값이 어떻게 출력되는지 확인할 수 있습니다.
$ bash exitstatus.sh Successful execution ===================== hello world Exit status 0 Incorrect usage ===================== ls: unrecognized option `--option' Try `ls --help' for more information. Exit status 2 Command Not found ===================== exitstaus.sh: line 15: bashscript: command not found Exit status 127 Command is not an executable ============================= -rw-r--r-- 1 root root 659 Mar 9 13:36 execution.sh exitstatus.sh: line 21: ./execution.sh: Permission denied Exit status 126
참고: 함수나 명령어의 반환값을 반드시 확인하는 것은 프로그래머의 핵심 책임 중 하나입니다. 어떤 코드를 작성하든 오류 처리를 점검하는 습관이 몸에 배도록 연습해야 하며, 이는 안정적이고 신뢰할 수 있는 셸 스크립트를 작성하는 첫걸음입니다.