十七、测试与静态检查
Shell 脚本直接操作进程、文件和远端系统,测试必须同时覆盖 stdout、stderr、退出状态和副作用。本章建立 “语法 → 静态检查 → 格式 → 单元测试 → 集成/端到端 → 兼容矩阵”的质量门禁。
本章目录
学习目标
- 正确选择 ShellCheck 方言,记录可审查的抑制理由。
- 分别断言 stdout、stderr、退出状态和文件/进程副作用。
- 用临时
PATH注入命令桩,不修改系统命令。 - 设计确定性测试,覆盖失败、信号、中断、清理和兼容性。
质量工具依赖
这些工具不属于 POSIX,但属于本知识库的强制质量门禁。版本应在本地和持续集成 (Continuous Integration,CI)环境中固定;工具缺失时必须使门禁失败,不能静默跳过。
| 工具 | 本机核验版本 | 许可证与维护 | 安装方式 | 可选替代 | 缺失时的行为 |
|---|---|---|---|---|---|
| ShellCheck | 0.11.0 | GNU General Public License v3.0(GPL-3.0);koalaman/ShellCheck 持续维护 | brew install shellcheck / apt-get install shellcheck | 使用固定版本的官方容器镜像;sh -n 只能补充、不能替代语义检查 | 门禁写 stderr 并退出 127 |
| shfmt | 3.14.1 | BSD 3-Clause License;mvdan/sh 持续维护 | brew install shfmt;Linux 可使用发行版包或固定版本二进制 | gofmt 风格的其他格式器不能保证同一输出 | 门禁写 stderr 并退出 127 |
| Bats-core | 1.14.0 | MIT License;bats-core 社区持续维护 | brew install bats-core / apt-get install bats | 本库的无框架测试运行器;复杂断言和生命周期能力较少 | 要求 Bats 的测试阶段写 stderr 并退出 127 |
本库固定格式参数为 POSIX 脚本 shfmt -ln posix -i 4 -ci,Bash 脚本 shfmt -ln bash -i 4 -ci。升级工具版本时先在独立分支检查新增诊断与格式差异。
