C.W.K.
Stream
Lesson 09 of 12 · published

에러 처리 — set -euo pipefail

~13 min · set, errexit, pipefail, nounset

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

방어적 헤더

#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'

전문적 bash 스크립트 다수가 이 두 줄로 시작. 없으면 에러가 조용히 삼켜지고 버그가 안 보임.

각 flag 의미

  • -e (errexit) — 어떤 command 가 non-zero 반환하면 즉시 종료 (test / pipeline 의 carve-out 있음).
  • -u (nounset) — 정의 안 된 변수 참조 시 종료. $PROOJECT 같은 오타 잡음.
  • -o pipefail — 파이프라인 exit code 가 첫 실패 단계의 거. 마지막 command 만 보지 않음.
  • IFS=$'\n\t' — word splitting 을 줄바꿈과 탭으로 제한 (공백 제외). 파일명 / 다중 단어 값에 안전.

알아야 할 carve-out

set -e 는 command 가 if, && 체인, | 의 일부면 발사 안 함. 이걸 활용:

# OK — caller 가 exit code 검사
if grep -q ERROR build.log; then ...

# 실패 허용은 || true
rm -rf .cache || true

-u 와 default

-u 면 unset 변수 참조 시 폭발. ${var:-} 가 빈 default, ${var:-fallback} 가 실제 default. 사용자 env 변수는 항상 방어적: "${DEBUG:-0}".

커스텀 에러 보고

err() { echo "$0:${LINENO}: $*" >&2; exit 1; }
[[ -d "$dir" ]] || err "missing $dir"

작은 err helper 가 스크립트 실패를 actionable 하게. 다음 레슨의 trap 과 짝지어 cleanup.

Code

방어적 bash 헤더·bash
#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'

err() { echo "${0}:${LINENO}: $*" >&2; exit 1; }

: "${INPUT:?INPUT env var required}"
[[ -f "$INPUT" ]] || err "$INPUT does not exist"

wc -l < "$INPUT"

External links

Exercise

기존 스크립트 하나에 set -euo pipefail 추가 후 실행. 새로 실패하면 진짜 버그 노출. 하나 고쳐 (보통 오타 또는 에러 삼키던 파이프라인).

Progress

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

댓글 0

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

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