你的Bash脚本为什么总在半夜崩?装上这个Skill,3分钟修好
写过 Shell 脚本的同学,有没有被 cp $src $dst 这种写法坑过?空格一多,整个命令直接炸掉。
今天推荐一个我刚发现的宝藏 Skill——Bash Defensive Patterns,专门教你怎么把 Shell 脚本写得像生产级代码一样稳。
为什么你的 Bash 脚本总翻车?
坦白讲,大多数人写 Bash 就是图快:变量不引号、错误不捕获、临时文件用完不清理。跑一次没事,跑十次总有一次栽跟头——而且是在凌晨 3 点的 CI 报错。
这个 Skill 的核心思路很简单:防御性编程。就像写其他语言的安全代码一样,在 Bash 里也要主动堵漏洞。
核心规则就这 4 条
1. 开头必须开严格模式
set -Eeuo pipefail
这条写上,-e 遇错就停,-u 遇未定义变量就炸,-o pipefail 管道里任何一步失败都算失败。写脚本不写这条,就像开车不系安全带。
2. 变量永远加引号
# 危险写法
cp $source $dest
# 正确写法
cp "$source" "$dest"
引号是 Bash 的生命线,防止空格和特殊字符把你的命令拆得七零八落。
3. 用 [[]] 而不是 []
# 更安全
if [[ -f "$file" && -r "$file" ]]; then
content=$(<"$file")
fi
[[]] 支持 && || 逻辑,也不会有 [ 的各种坑。
4. 临时文件一定要 cleanup
trap 'rm -rf "$TMPDIR"' EXIT
TMPDIR=$(mktemp -d)
脚本崩了也要清理,trap 就是你的安全网。
进阶技巧:dry-run 模式
最让我惊喜的是这个——给危险操作加预览:
DRY_RUN="${DRY_RUN:-false}"
run_cmd() {
[[ "$DRY_RUN" == "true" ]] && echo "[DRY RUN] Would run: $*" && return 0
"$@"
}
run_cmd rm -rf /tmp/old-cache
写删除脚本前先 DRY_RUN=true ./cleanup.sh 预览一把,安全感拉满。
使用方式
在 Claude Code 里安装:
/plugin install bash-defensive-patterns
或者直接参考它的 SKILL.md 里的模板,改写自己项目的脚本。
Skill 里内置了 10+ 种常见场景模板:安全目录检测、参数解析、结构化日志、进程编排、幂等设计……基本上你踩过的坑,Skill 里都有现成解法。
适用场景
- CI/CD 流水线脚本 —— 一个步骤失败就要立即停止
- 自动化部署脚本 —— 临时文件清理、幂等性必须保证
- 系统管理工具 —— 跨 Linux/macOS 的兼容性处理
- 任何多人协作的 Shell 项目 —— 防御性写法减少沟通成本
一句话总结
你的 CI 半夜报错,很可能就是没加 set -Eeuo pipefail。装上这个 Skill,3 分钟改好开头,比排查问题省时间多了。
GitHub:
Bash Defensive Patterns(Star 38k+)
GitHub: https://github.com/wshobson/agents/tree/main/plugins/shell-scripting/skills/bash-defensive-patterns
评论区
登录后可评论。