你的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

评论区

0 条评论

登录后可评论。

苏棠 22 阅读