用途:编写或审计能在真实环境存活的 Shell 脚本,覆盖 CI 脚本、init/deploy 脚本与容器入口等场景。以 bash 5.x 为主,仅在目标环境只保证 POSIX sh 时使用 sh;macOS 自带 bash 3.2 且默认 zsh,需注意可移植性规则。
决策前提:若逻辑超过约 100 行、需要真实数据结构、细粒度错误处理(重试、区分错误类型、部分回滚)、非整数运算与日期运算、结构化格式解析、超出“跑 N 个任务再 wait”的可移植并发,或涉及安全关键输入处理,应改用 Python/Go 等,并在输出中明确说明。Shell 适合进程粘合、CI 步骤、容器入口、小型安装/部署包装与环境初始化。
BUILD 模式:刻意选择方言,默认 #!/usr/bin/env bash,不要 #!/bin/sh 配 bash 特性;以 set -euo pipefail、trap 清理、IFS 规范开头,并清楚 set -e 不触发的位置;所有展开加引号,用数组构建命令而非字符串拼接;错误输出到 stderr 并带脚本名与上下文,退出码有意义并写入 --help;通过 mktemp 与 trap 实现幂等、可中断、原子写入,必要时用 flock。完成前跑 shellcheck(发现视为阻塞,抑制需注释说明)与 shfmt -d;本地不可用需声明并要求 CI 执行。始终提供 --help,分发工具提供 --version,set -x 仅在 DEBUG/TRACE 环境变量下开启。
AUDIT 模式:从规则文件的审计清单自底向上排查,若可用则对每个脚本运行 shellcheck -S style,并结合上下文判断可利用性与影响范围。严重级别分 CRITICAL、HIGH、MEDIUM、LOW,发现格式含严重级别、文件:行、标题、原文证据、触发条件与影响、具体修复代码和工作量。
规则索引覆盖:安全基线(shebang、set -euo pipefail 的局限、引号与分词错误、zsh 与 bash 差异)、PowerShell(无 set -euo pipefail,$PSNativeCommandUseErrorActionPreference 默认 $false,三个状态变量不一致,pwsh -Command、GitHub Actions 自定义 shell、Invoke-Expression、执行策略非安全边界、PSScriptAnalyzer)、临时命令(rg -r 含义、zsh 差异、搜索器默认排除)、列取与选择(gh pr list 默认 30 条、分页与服务端计数、选择器与过滤误配)、临时副作用(只读意图不等于只读命令、磁盘写满、进程表耗尽)、构造与清理(数组、IFS 作用域、trap 清理、mktemp、[[ ]]/printf/local/readonly、globbing)、健壮性与正确性(参数解析、输入校验、POSIX 与 bash 可移植性、stderr 与退出码、PIPESTATUS、command -v、网络超时重试、flock、幂等与原子写、安全文件名)、安全(eval/注入、密钥纪律、PATH 卫生、sudo 纪律、curl|bash、临时文件竞态、umask、CI 中的 ShellCheck 与 shfmt)、CI 与运维(后台构建进程管理、GitHub Actions shell 陷阱、容器入口 exec 与 PID 1、Makefile、长任务日志)。
十条不可妥协项包括:bash 脚本一律加 shebang 与 set -euo pipefail;所有展开加引号;用数组传参;trap cleanup EXIT 配合 mktemp;不 eval 插值不可信数据,用 -- 分隔;argv、环境变量与 set -x 下不出现密钥;错误带上下文进 stderr、退出码有意义;网络调用加 --fail、超时与有界重试;处理任意文件名用 find -print0 与 xargs -0 或 while IFS= read -r;CI 强制 ShellCheck 与 shfmt。价格、平台支持与具体效果资料未提供。