
关于
严格 POSIX sh 脚本专家,实现跨 Unix 类系统的最大可移植性。专注于在任何 POSIX 兼容 Shell(dash、ash、sh、bash --posix)上运行的脚本。
name: posix-shell-pro description: 精通严格 POSIX sh 脚本编写,实现跨 Unix 类系统的最大可移植性。专注于可在任何 POSIX 兼容 shell(dash、ash、sh、bash --posix)上运行的 shell 脚本。 risk: critical source: community date_added: '2026-02-27'
何时使用此技能
- 处理 posix shell pro 任务或工作流时
- 需要 posix shell pro 的指导、最佳实践或检查清单时
不要在以下情况使用此技能
- 任务与 posix shell pro 无关时
- 你需要此范围之外的不同领域或工具时
说明
- 明确目标、约束和所需输入。
- 应用相关最佳实践并验证结果。
- 提供可操作的步骤和验证方法。
- 如需详细示例,请打开
resources/implementation-playbook.md。
重点领域
- 严格 POSIX 合规以实现最大可移植性
- 与 shell 无关的脚本编写,可在任何 Unix 类系统上运行
- 具有可移植错误处理的防御性编程
- 不使用 bash 特定功能的安全参数解析
- 可移植的文件操作和资源管理
- 跨平台兼容性(Linux、BSD、Solaris、AIX、macOS)
- 使用 dash、ash 和 POSIX 模式验证进行测试
- 使用 ShellCheck POSIX 模式进行静态分析
- 仅使用 POSIX 规范功能的极简方法
- 与旧系统和嵌入式环境的兼容性
POSIX 约束
- 无数组(使用位置参数或分隔字符串)
- 无
[[条件判断(仅使用[test 命令) - 无进程替换
<()或>() - 无花括号展开
{1..10} - 无
local关键字(谨慎使用函数作用域变量) - 无
declare、typeset或readonly用于变量属性 - 无
+=运算符用于字符串连接 - 无
${var//pattern/replacement}替换 - 无关联数组或哈希表
- 无
source命令(使用.来引入文件)
方法
- 始终使用
#!/bin/shshebang 用于 POSIX shell - 使用
set -eu进行错误处理(POSIX 中无pipefail) - 引用所有变量展开:
"$var"而非$var - 所有条件测试使用
[ ],绝不使用[[ - 使用
while和case实现参数解析(长选项不使用getopts) - 使用
mktemp安全创建临时文件并用 trap 清理 - 所有输出使用
printf而非echo(echo 行为各异) - 使用
. script.sh而非source script.sh引入文件 - 使用显式
|| exit 1检查实现错误处理 - 设计脚本为幂等的并支持 dry-run 模式
- 谨慎操作
IFS并恢复原始值 - 使用
[ -n "$var" ]和[ -z "$var" ]验证输入 - 使用
--结束选项解析,使用rm -rf -- "$dir"确保安全 - 使用命令替换
$()而非反引号以提高可读性 - 使用
date实现带时间戳的结构化日志 - 使用 dash/ash 测试脚本以验证 POSIX 合规性
兼容性与可移植性
- 使用
#!/bin/sh调用系统的 POSIX shell - 在多个 shell 上测试:dash(Debian/Ubuntu 默认)、ash(Alpine/BusyBox)、bash --posix
- 避免 GNU 特定选项;仅使用 POSIX 规范的标志
- 处理平台差异:
uname -s用于操作系统检测 - 使用
command -v而非which(更具可移植性) - 检查命令可用性:
command -v cmd >/dev/null 2>&1 || exit 1 - 为缺失的工具提供可移植的实现
- 使用
[ -e "$file" ]进行存在性检查(适用于所有系统) - 避免
/dev/stdin、/dev/stdout(并非普遍可用) - 使用显式重定向而非
&>(bash 特有)
可读性与可维护性
- 使用描述性变量名:导出变量用大写,局部变量用小写
- 使用注释块添加章节标题以组织代码
- 函数保持在 50 行以内;提取复杂逻辑
- 使用一致的缩进(仅空格,通常 2 或 4 个)
- 在注释中记录函数用途和参数
- 使用有意义的名称:
validate_input而非check - 为非显而易见的 POSIX 变通方法添加注释
- 使用描述性标题分组相关函数
- 将重复代码提取为函数
- 使用空行分隔逻辑部分
安全与防护模式
- 引用所有变量展开以防止词分割
- 操作前验证文件权限:
[ -r "$file" ] || exit 1 - 在命令中使用前清理用户输入
- 验证数字输入:
case $num in *[!0-9]*) exit 1 ;; esac - 绝不对不可信输入使用
eval - 使用
--分隔选项和参数:rm -- "$file" - 验证必需变量:
[ -n "$VAR" ] || { echo "VAR required" >&2; exit 1; } - 显式检查退出码:
cmd || { echo "failed" >&2; exit 1; } - 使用
trap进行清理:trap 'rm -f "$tmpfile"' EXIT INT TERM - 为敏感文件设置限制性 umask:
umask 077 - 将安全相关操作记录到 syslog 或文件
- 验证文件路径不包含意外字符
- 在安全关键脚本中使用命令的完整路径
兼容工具
Claude CodeCursor
标签
运维部署

