Bash 防御性编程模式
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @org-02qudk26/bash-defensive-patterns。
技能介绍
为什么 Shell 脚本总在生产里翻车
Bash 自动化一旦进入 CI/CD、部署或运维链路,一次未引用的变量、被 word splitting 的路径,或缺少 set -e 的静默失败,都可能把局部错误放大成整批任务中断。POSIX 与 Bash 扩展混用、临时 curl | bash 与长期维护的脚本库,对错误处理与边界条件的要求完全不同。
技能覆盖什么
本技能围绕可用于生产的 Bash 组织,强调防御性编程、错误处理与安全默认值,并指向 resources/implementation-playbook.md 中的模式、检查清单与模板。核心工作流与 SKILL.md 一致:
- 确认环境:目标 shell、操作系统与执行上下文(是否交互、是否在 CI 中)。
- 从首行启用严格模式:如
set -euo pipefail等安全默认,避免「命令失败但脚本继续跑」。 - 输入与数据面:校验外部输入;变量与路径始终加引号;安全读写临时文件与敏感路径。
- 可观测与失败路径:结构化日志、错误 trap(清理临时资源、明确退出码),并配合基础测试验证边界情况。
适用场景包括生产自动化、CI/CD 脚本、系统管理工具、部署自动化、跨平台脚本库,以及需要完整日志与监控的 shell 工程。
边界与安全
- 不适用:一次性临时命令、严格只支持 POSIX
sh的环境、与 shell 无关的任务。 - 安全:避免在无确认或 dry-run 的前提下执行破坏性命令;除非确有需要,不要以 root 运行脚本。
更细的模式与清单见 playbook,而不是在本介绍中重复堆砌命令。
使用场景
- 在 Jenkins 或 GitLab CI 里维护部署脚本,需要失败时立刻退出并保留可追踪的退出码与日志
- 编写批量重启服务或清理磁盘空间的运维脚本,路径含空格或用户输入时必须安全引用变量
- 把多套环境(Linux/macOS)共用的安装脚本抽成库,要求统一启用 pipefail 与 trap 清理临时目录
- 为发布流水线增加 dry-run 与确认步骤,避免误删数据目录或未备份就覆盖生产配置
适合人员
- 负责维护公司 CI/CD 流水线、希望把 fragile 的 shell 步骤改成可复现失败行为的平台工程师
- 需要编写长期运行的 cron 或 systemd 定时任务脚本、必须处理边界输入与异常退出的系统管理员
- 在团队内推广 shell 脚本规范、要对照检查清单审查同事 PR 里 Bash 改动的 DevOps 或 SRE
- 正在把手工部署步骤脚本化、担心生产环境因未加引号或忽略管道错误导致静默失败的发布负责人