bash-defensive-patterns
작성자 wshobsonbash-defensive-patterns는 strict mode, traps, cleanup, quoting, 입력 검증 패턴을 바탕으로 프로덕션 자동화, CI/CD, 시스템 스크립트에서 더 안전한 Bash를 작성하도록 돕는 스킬입니다.
이 스킬은 78/100점을 받아, 바로 실행하는 자동화 패키지보다 재사용 가능한 Bash 하드닝 가이드를 찾는 사용자에게 적합한 디렉터리 등록 후보입니다. 저장소 근거를 보면 placeholder가 아닌 충실한 내용과 명확한 사용 시점, 실용적인 코드 예제가 포함되어 있어 에이전트가 적절한 상황에 호출하고 일반적인 프롬프트보다 더 신뢰할 수 있는 셸 패턴을 얻을 가능성이 높습니다. 다만 설치 판단 관점에서는 문서 중심 리소스에 그치며, 지원 파일·스크립트·명시적인 quick-start/install 흐름이 없다는 점이 주요 한계입니다.
- 트리거 적합성이 높습니다. 설명과 'When to Use This Skill' 섹션이 프로덕션 Bash, CI/CD, 시스템 유틸리티 스크립팅을 분명하게 겨냥합니다.
- 실무 내용이 충분합니다. 긴 SKILL.md에 코드 펜스와 함께 strict mode, traps, cleanup, 안전 수칙 같은 구체적인 주제가 담겨 있습니다.
- placeholder가 아닌 신뢰할 만한 결과물입니다. 유효한 frontmatter, 충분한 본문 분량, placeholder나 실험 단계 신호 부재, 방어적 프로그래밍에 집중된 범위를 갖추고 있습니다.
- 도입은 문서 의존적입니다. 실행 추측을 더 줄여 줄 스크립트, 참조 파일, 보조 리소스가 없습니다.
- 저장소 근거상 install/quick-start 가이드가 빠져 있고 실제 워크플로 신호도 비교적 약해, 설치 판단의 명확성은 다소 떨어집니다.
bash-defensive-patterns 스킬 개요
bash-defensive-patterns 스킬이 하는 일
bash-defensive-patterns 스킬은 단순히 문법적으로 맞는 shell snippet이 아니라, 운영 자동화에 투입해도 더 안전한 Bash를 작성하도록 에이전트를 가이드합니다. 핵심은 실패 처리, 정리(cleanup), quoting, 입력 검증, 그리고 CI job, deploy script, cron task, system utility에서 조용히 망가지는 일을 줄여 주는 패턴에 있습니다.
누가 설치하면 좋은가
이 스킬은 backend engineer, DevOps team, SRE, platform engineer처럼 Bash가 운영 경로에 들어가는 사람들에게 특히 잘 맞습니다. 잘못된 스크립트 하나가 파일을 지우거나, 오류를 숨기거나, 중간 상태를 남길 수 있는 환경이라면 더더욱 그렇습니다. 특히 shell code로 build, deployment, backup, migration, environment setup을 이어 붙이는 경우에는 bash-defensive-patterns for Backend Development 용도로 매우 유용합니다.
실제로 해결하는 문제
대부분의 사용자는 “더 많은 Bash”가 필요한 것이 아닙니다. 초기에 빨리 실패하고, 오류를 분명하게 드러내고, 정리를 확실히 하고, edge case에서도 예측 가능하게 동작하는 Bash가 필요합니다. bash-defensive-patterns 스킬의 가치는 shell을 일회성 glue code로 다루지 않고, 운영 리스크를 염두에 두고 스크립트를 생성하거나 리뷰하게 만든다는 데 있습니다.
일반적인 shell 프롬프트와 다른 점
일반 프롬프트는 happy path에서는 돌아가지만 set -Eeuo pipefail, trap, 안전한 temp 처리, 방어적 quoting, 명확한 exit 동작을 빠뜨린 스크립트를 내놓는 경우가 많습니다. 반면 이 스킬은 견고한 기본값을 분명하게 선호하며, 빠르게 한 번 쓰고 버리는 명령이 아니라 production-grade 패턴 쪽으로 결과를 밀어 줍니다.
도입 전에 알아둘 점
이 저장소는 코드가 많은 패키지가 아니라 SKILL.md 문서 하나로 구성되어 있습니다. 그래서 bash-defensive-patterns install 자체는 간단하지만, 실제 가치는 어떤 맥락과 함께 호출하느냐에 크게 좌우됩니다. 운영 환경, 예상 실패 방식, 스크립트 목적을 함께 주면 출력 품질이 눈에 띄게 좋아지지만, 그냥 “a bash script”만 요청하면 차별화된 결과를 얻기 어렵습니다.
bash-defensive-patterns 스킬 사용 방법
bash-defensive-patterns 스킬 설치 맥락
에이전트 플랫폼이 GitHub repository 기반 Skills를 지원한다면, 먼저 소스 repository를 추가한 뒤 작업에서 bash-defensive-patterns를 이름으로 호출하면 됩니다. 흔한 설치 패턴은 다음과 같습니다.
npx skills add https://github.com/wshobson/agents
그다음 스크립트를 작성하거나 리뷰할 때 에이전트에게 bash-defensive-patterns 스킬을 사용하라고 요청하세요. 이 스킬의 repository 경로는 다음입니다.
plugins/shell-scripting/skills/bash-defensive-patterns
먼저 읽어야 할 파일
가장 먼저 볼 파일은 다음입니다.
SKILL.md
이 스킬에는 추가 지원 파일이 없기 때문에, 거의 모든 판단 기준과 가이드가 이 문서 하나에 들어 있습니다. 빠르게 평가하기 좋다는 뜻이기도 합니다. heading만 훑어봐도 이 가이드가 당신의 Bash 안전성 기준과 맞는지 금방 판단할 수 있습니다.
실무에서 잘 맞는 사용 사례
다음과 같은 상황에서는 bash-defensive-patterns usage가 특히 유용합니다.
- 새 production shell script를 생성해야 할 때
- 기존 스크립트를 배포 전 단계에서 더 단단하게 만들고 싶을 때
- CI/CD Bash에 위험한 가정이 없는지 리뷰할 때
- cleanup 및 error trap을 추가할 때
- logging과 실패 가시성을 개선할 때
- 입력값, 경로, 외부 command 의존성을 검증할 때
bash-defensive-patterns 스킬이 잘 동작하려면 필요한 입력
출력 품질을 높이려면 원하는 결과만 말하지 말고, 다음 정보를 함께 주세요.
- target shell: 알고 있다면
bash버전 - 실행 환경: local Linux, macOS, container, CI runner
- 스크립트가 interactive인지 non-interactive인지
- 사용 가능한 외부 도구:
jq,curl,awk,sed,mktemp등 - 실패 정책: fail fast, retry, partial error를 허용하고 계속 진행할지
- side effect: 파일 쓰기, temp dir 생성, network call, delete 수행 여부
- 보안 우려: secret, 파괴적 command, path safety
이 맥락이 없으면 에이전트가 방어 패턴을 적용하더라도, 당신 환경에 맞게 세밀하게 조정하기는 어렵습니다.
막연한 요청을 강한 프롬프트로 바꾸기
약한 프롬프트:
- “Write a bash deploy script.”
더 강한 프롬프트:
- “Use the
bash-defensive-patternsskill to write a non-interactive Bash deploy script for a Linux CI runner. It should useset -Eeuo pipefail, validate required env vars, check dependencies, create and clean up a temp directory, log failed commands with line numbers, and abort safely before any destructive step if prechecks fail.”
두 번째 요청이 더 좋은 이유는, 어떤 실패 처리와 운영 동작이 중요한지 에이전트에게 명확히 알려 주기 때문입니다.
새 스크립트를 위한 프롬프트 템플릿
bash-defensive-patterns guide 스타일의 요청에는 아래 템플릿이 잘 맞습니다.
- Goal: 스크립트가 달성해야 하는 일
- Environment: 실행 위치와 환경
- Inputs: flag, env var, file, secret
- External commands: 사용 가능한 도구
- Failure handling: retry, rollback, cleanup, exit code
- Safety rules: unquoted expansion 금지, unsafe
rm금지, path 검증 - Output preference: 전체 스크립트, 리뷰 노트, 기존 코드에 대한 patch
이 구조를 쓰면 스킬이 더 안전하고, 실제로 바로 도입하기 쉬운 코드를 만들어 내기 좋습니다.
기존 Bash 리뷰용 프롬프트 템플릿
이미 스크립트가 있다면, 새로 다시 쓰게 하기보다 문제 지점을 겨냥한 리뷰를 요청하는 편이 낫습니다.
- “Use
bash-defensive-patternsto review this Bash script for strict mode issues, quoting bugs, unsafe temp handling, missing cleanup, unchecked command failures, and poor error messages. Return a prioritized list of risks, then a corrected version.”
이 방식이 잘 먹히는 이유는, 이 스킬이 shell에서 자주 발생하는 실패 패턴을 매우 강하게 의식하고 있기 때문입니다.
시간을 아껴 주는 실전 워크플로
추천할 만한 흐름은 다음과 같습니다.
- 스크립트를 생성하거나 붙여 넣습니다.
- 에이전트에게
bash-defensive-patterns적용을 요청합니다. - trap, cleanup, strict mode 동작은 사람이 직접 다시 확인합니다.
- 가능하다면
shellcheck를 별도로 돌립니다. - 성공 경로만이 아니라 실패 경로도 테스트합니다.
이 스킬은 구조를 튼튼하게 잡는 데 도움이 되지만, 실제 경로와 실패 조건은 결국 실행 테스트로 확인해야 합니다.
bash-defensive-patterns 스킬이 주로 개선하는 부분
소스 기준으로 보면, 다음 항목에 특히 무게를 둔다고 기대하면 됩니다.
set -Eeuo pipefail를 포함한 strict modeERR및EXITtrap- temp resource cleanup
- 더 안전한 변수 처리
- edge case 방어
- 운영 압박 속에서도 유지보수 가능한 스크립트 작성
그래서 즉석에서 쓰는 ad hoc command line보다, 운영용 Bash에서 더 큰 가치를 냅니다.
제약과 트레이드오프
bash-defensive-patterns는 Bash runtime도 아니고, linter도 아니며, compatibility test suite도 아닙니다. 가이드와 코드 패턴은 제공하지만, target platform을 명시하지 않으면 모든 환경에서 각 구문이 동일하게 동작하는지 검증해 줄 수는 없습니다. 또한 엄격한 방어 스타일은 짧은 스크립트도 다소 무겁게 보이게 만들 수 있습니다. production workflow에서는 그게 장점이지만, 일회성 로컬 작업에는 과하다고 느껴질 수 있습니다.
이 스킬을 건너뛰는 편이 나은 경우
다음 상황이라면 이 스킬을 앞세우지 않는 편이 좋습니다.
- one-line shell command만 필요할 때
- Python, Go, 혹은 더 안전한 다른 언어로 구현하는 게 맞는 작업일 때
- 환경이 Bash가 아니라
sh또는dash일 때 - 운영 오버헤드 없이 최소한의 스크립트만 원할 때
이런 경우에는 bash-defensive-patterns skill이 필요한 수준보다 구조가 더 많을 수 있습니다.
bash-defensive-patterns 스킬 FAQ
bash-defensive-patterns 스킬은 초보자에게도 좋은가
그렇습니다. 특히 장난감 예제가 아니라 실제 운영 작업을 위한 Bash를 배우는 중이라면 더 좋습니다. 가이드는 실전적이고, 흔한 실수를 피하는 데 초점이 맞춰져 있습니다. 다만 완전 초보자라면 trap, exit code, strict mode의 부작용은 추가 설명이 조금 필요할 수 있습니다. 그래도 이런 패턴은 초기에 익혀 둘 가치가 큽니다.
이미 ShellCheck를 쓰고 있어도 bash-defensive-patterns install이 가치가 있나
네. ShellCheck와 bash-defensive-patterns는 하는 일이 다릅니다. ShellCheck는 많은 문법 및 스타일 문제를 잡아 주고, 이 스킬은 더 안전한 전체 스크립트 구조, cleanup 흐름, 검증 전략, 실패 의미론을 선택하도록 에이전트를 이끕니다. 함께 쓰면 상호 보완이 잘 됩니다.
bash-defensive-patterns usage는 CI/CD 작업에 잘 맞나
매우 잘 맞습니다. CI와 deployment script는 숨겨진 pipeline error, 빠진 env var, partial state, 불명확한 log처럼 취약한 방식으로 실패하는 경우가 많습니다. 이 스킬은 바로 그런 실패 유형을 겨냥하기 때문에 Backend Development와 delivery automation에 특히 잘 맞습니다.
새 스크립트 생성이 아니라 오래된 스크립트 리뷰에도 쓸 수 있나
물론입니다. 오히려 가장 좋은 활용처 중 하나입니다. unsafe expansion, 누락된 trap 사용, dependency check 부재, 약한 input validation, safeguard 없는 destructive command를 점검해 달라고 요청하세요. 전체를 갈아엎는 rewrite보다, 이런 식의 targeted hardening에서 더 큰 가치를 얻는 경우가 많습니다.
언제는 일반 프롬프트만으로 충분한가
버려도 되는 로컬 스크립트, 탐색 목적의 작업, 빠른 command 조합 정도라면 일반 프롬프트로도 충분합니다. 반대로 스크립트가 공유되거나, 스케줄링되거나, CI에서 돌거나, 파일·credential·deployment state를 다뤄야 한다면 bash-defensive-patterns를 쓰는 편이 낫습니다.
도입을 막는 장애물은 있나
가장 큰 장애물은 설치 복잡도가 아니라 입력 품질입니다. 이 repository는 가이드 파일 하나로 이루어져 있기 때문에, 환경, 위험 허용 범위, 운영 제약을 에이전트에게 알려 줄수록 더 잘 작동합니다. 이런 정보를 빼면 결과가 아주 나쁘지는 않더라도 production-ready 수준은 떨어질 수 있습니다.
bash-defensive-patterns 스킬을 더 잘 활용하는 방법
운영 제약을 처음부터 명시하기
bash-defensive-patterns 출력 품질을 가장 빠르게 끌어올리는 방법은 아래 정보를 처음부터 주는 것입니다.
- Bash 버전
- 플랫폼
- 사용 가능한 command
- 실패 시 즉시 중단할지, 일부는 계속 진행할지
- cleanup 요구사항
- 파괴적 동작 허용 여부
이 정보에 따라 어떤 방어 패턴이 맞는지가 달라집니다.
코드만이 아니라 실패 경로 설계를 요청하기
더 좋은 요청 방식은 다음과 같습니다.
- “Generate the script and explain how it behaves on dependency failure, bad input, network timeout, and cleanup.”
이렇게 해야 겉보기에만 정돈된 스크립트가 아니라, 실제 운영에서 어떻게 동작하는지를 드러내도록 스킬을 밀어 줄 수 있습니다.
리뷰할 위험 구간을 구체적으로 지정하기
기존 스크립트를 개선할 때는, 에이전트에게 위험 후보를 직접 짚어 주는 편이 훨씬 효과적입니다.
- temp file handling
- wildcard expansion
- filename을 순회하는 loop
- pipeline error masking
- 누락된 quote
- log에 secret 유출
- partial deploy rollback
그냥 “더 안전하게 만들어 줘”라고 하는 것보다 이런 식으로 지정해야 결과가 좋아집니다.
의견이 분명한 patch를 요청하기
첫 답변이 너무 두루뭉술하다면 다음 중 하나를 요청하세요.
- unified diff
- strict mode와 trap이 들어간 rewritten header
- preflight validation section
- logging helper
- cleanup function
- 명시적인 exit code
이런 요청은 bash-defensive-patterns skill이 실제로 바로 적용할 수 있는 변경안을 내놓게 만듭니다.
strict mode 가정을 꼭 검증하기
흔한 실패 패턴 중 하나는, non-zero를 정상으로 기대하는 command가 있는데도 strict mode를 그대로 도입해 버리는 것입니다. set -e나 pipefail 때문에 원치 않는 종료가 발생할 수 있는 지점을 찾아 달라고 하고, 그 부분을 의도적으로 다시 작성해 달라고 요청하세요. “방어적”인 코드와 “실제로 쓸 수 있는” 코드 사이의 가장 큰 간극이 여기서 생기는 경우가 많습니다.
위험이 명확하지 않은 곳에만 주석을 달라고 요청하기
방어적인 Bash는 금방 시끄러워질 수 있습니다. 첫 출력에 주석이 너무 많다면 이렇게 요청해 보세요.
- “Keep comments only on non-obvious defensive choices.”
이렇게 하면 안전성은 유지하면서도, 최종 스크립트를 더 읽기 쉽고 유지보수하기 쉽게 만들 수 있습니다.
실제 오류 사례로 반복 개선하기
가장 좋은 개선 루프는 실제 실패 사례를 붙여 넣는 것입니다.
- “In CI, this failed because
$ARTIFACT_DIRwas unset.” - “Cleanup did not run after a command in a function failed.”
- “The script broke on filenames with spaces.”
실제 실패를 주면 스킬이 추측으로 대응하는 대신, 맞는 방어 패턴을 정확히 적용할 수 있습니다.
bash-defensive-patterns를 검증 도구와 함께 쓰기
더 강한 결과를 원한다면 이 스킬을 다음과 함께 사용하세요.
- 정적 분석용
shellcheck - 성공/실패 케이스 실행 테스트
- production과 유사한 최소 container 또는 CI job
- happy path fixture만이 아니라 잘못된 입력 샘플
이 스킬은 스크립트 설계를 개선하고, 도구는 실제 동작을 검증해 줍니다.
Bash를 넘어가야 할 시점을 알기
가장 좋은 개선책이 Bash를 더 늘리는 것이 아닌 경우도 있습니다. 스크립트에 복잡한 parsing, concurrency, 구조화된 error propagation, cross-platform 보장이 필요하다면, 이 작업을 Python이나 Go로 옮겨야 하는지 에이전트에게 물어보세요. bash-defensive-patterns를 잘 활용한다는 것은 Bash가 틀린 도구인 순간을 알아채는 것까지 포함합니다.
