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

실전 스크립트 — backup, deploy, daily-check

~13 min · practical, backup, deploy

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

실전 shell 스크립트의 모양

프로덕션 급 shell 스크립트는 구조 공유: 방어적 헤더, 설정 블록, helper 함수, 메인 흐름, 종료 cleanup. 복사해서 변형할 수 있는 세 패턴.

backup.sh — 날짜별 archive 로 rsync

#!/usr/bin/env bash
set -euo pipefail
src="${1:-$HOME}"
dest="${BACKUP_ROOT:-/Volumes/backup}/$(date +%Y/%m/%d)"
mkdir -p "$dest"
rsync -avzP --delete --exclude='.cache' "$src/" "$dest/"
echo "backup at $dest"

deploy.sh — 테스트 후 push

#!/usr/bin/env bash
set -euo pipefail
log() { printf '%(%H:%M:%S)T %s\n' -1 "$*"; }
trap 'log "deploy failed at line $LINENO"' ERR
log 'running tests'
./test.sh
log 'pushing'
git push origin main
log 'done'

daily-check.sh — 헬스 게이트

#!/usr/bin/env bash
set -euo pipefail
fail=0
checks=(
  'curl -sSf https://api.example/health'
  'pgrep -f my-worker'
  'df -P / | awk "NR==2 && \$5+0 < 90"'
)
for c in "${checks[@]}"; do
  if eval "$c" >/dev/null; then
    echo "✔ $c"
  else
    echo "✘ $c"
    fail=1
  fi
done
exit "$fail"

Pippa 패턴

cwkPippa 의 pippa-working-scripts 디렉터리가 같은 모양 — 방어적 헤더, 라이프사이클 주석 (# @pippa: persistent | purpose), 날짜 prefix 대신 목적 기반 이름. 2026 의 ergonomic shell 스크립트 참고.

Code

재사용 가능한 헤더 블록·bash
#!/usr/bin/env bash
# @pippa: persistent | weekly backup of ~ to NAS
set -euo pipefail
IFS=$'\n\t'
HERE="$(cd "$(dirname "$0")" && pwd)"
log() { printf '%(%H:%M:%S)T %s\n' -1 "$*" >&2; }
die() { log "FATAL: $*"; exit 1; }
trap 'die "failed at line $LINENO"' ERR
# real work below
log 'starting'

External links

Exercise

재사용 헤더를 ~/bin/_template.sh 로 저장. 그걸로 작은 backup.sh 작성 — $HOME/notes/~/Backups/notes-$(date +%F) 로 rsync. 실행 후 set -euo pipefail 아래서 잘 도는 거 확인.

Progress

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

댓글 0

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

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