Computer >> 컴퓨터 >  >> 프로그래밍 >> Bash 프로그래밍

실전 예제로 배우는 Bash 셸 종료 상태(Exit Status) 완벽 가이드

앞선 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

참고: 함수나 명령어의 반환값을 반드시 확인하는 것은 프로그래머의 핵심 책임 중 하나입니다. 어떤 코드를 작성하든 오류 처리를 점검하는 습관이 몸에 배도록 연습해야 하며, 이는 안정적이고 신뢰할 수 있는 셸 스크립트를 작성하는 첫걸음입니다.