C.W.K.
Stream
Lesson 10 of 10 · published

Exit Code 와 $?

~15 min · exit-code, status, errors, shell

Level 0창 구경꾼
0 XP0/95 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

모든 command 가 남기는 숫자

Unix 의 모든 프로세스는 0~255 범위의 정수로 종료해. Shell 은 가장 최근 exit code 를 $? 에 저장. 관례상 0 은 성공, 0 이 아닌 거는 '뭔가 어긋남 — 어떻게 어긋났는지는 숫자가 알려줌'. 이게 && 체인과 모든 CI 파이프라인 디버깅의 기반이야.

흔한 code

  • 0 — 성공
  • 1 — 일반 실패 (구체적이지 않은 모든 실패)
  • 2 — 사용법 에러 (사용자 flag 가 말이 안 됨)
  • 126 — command 는 있는데 실행 권한 없음
  • 127 — command not found
  • 128 + N — signal N 으로 종료. Ctrl+C (SIGINT = 2) → 130; kill -9 (SIGKILL = 9) → 137.

잘 짜인 도구는 자기만의 코드를 man page 에 적어둬. grep 은 0 = 매치, 1 = 매치 없음, 2 = 에러.

성공 / 실패에 따라 체이닝

cmd1 && cmd2 = cmd1 성공 시에만 cmd2. cmd1 || cmd2 = cmd1 실패 시에만 cmd2. cmd1 ; cmd2 = 무조건 둘 다. 합치면 한 줄짜리 if/else: ./test.sh && ./deploy.sh || echo "tests failed".

직접 반환하기

스크립트에서 exit N 은 프로세스를 N 으로 종료. 함수에서 return N 은 caller 의 $? 를 설정. 실패 경로에서 조용히 exit 0 하지 마. 그러면 CI 가 너한테 거짓말함.

파이프라인의 exit code

기본적으로 파이프라인의 exit code 는 마지막 command 의 거. cat missing.txt | wc -l 는 cat 이 실패해도 0 이 떠. 스크립트에 set -o pipefail 넣으면 어느 단계든 실패 시 전체 실패. Scripting 트랙에서 set -euo pipefail 패턴으로 더 다뤄.

Code

command 마다 $? 확인·bash
ls /tmp; echo "$?"           # 0
ls /no/such/dir; echo "$?"   # 1 or 2
grep zzz /etc/hosts; echo "$?"  # 1 (no match)
false; echo "$?"             # 1
true; echo "$?"              # 0
결과에 따라 command 체이닝·bash
# Run deploy only if tests pass
./test.sh && ./deploy.sh
# Fall back if first fails
ping -c1 server.local || echo 'server unreachable'
# Real if/else
git pull && echo 'updated' || echo 'pull failed'

External links

Exercise

false; echo $? 실행. grep zzz /etc/hosts; echo $?. sleep 60 을 Ctrl+C 로 끊은 뒤 echo $? (130) 확인. 그 다음 한 줄: ./check.sh && echo OK || echo FAIL. check.sh 가 0 / 1 반환할 때 각각 가지가 맞게 가는지 확인.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.