posix-shell-pro

精通严格遵循POSIX标准的sh脚本编写,确保在类Unix系统间实现最大程度的可移植性。专注于开发能在任何符合POSIX标准的shell(如dash、ash、sh、bash --posix模式)上运行的脚本。

作者

安装

热度:4

下载并解压到你的 skills 目录

复制命令,发送给 OpenClaw 自动安装:

下载并安装这个技能 https://openskills.cc/api/download?slug=sickn33-skills-posix-shell-pro&locale=zh&source=copy

POSIX Shell Pro - 严格 POSIX sh 脚本编程专家

技能概述


编写可在任何 Unix-like 系统上运行的严格兼容 POSIX shell 脚本,实现从 Linux、BSD 到 macOS、Solaris 的最大可移植性。

适用场景

1. 跨平台脚本开发


当你编写的 shell 脚本需要在多种操作系统上运行时,包括 Debian/Ubuntu(dash)、Alpine/BusyBox(ash)、macOS、FreeBSD、Solaris 等,使用 POSIX sh 可以确保脚本在任何标准 Unix 环境中正常工作,无需担心 bash 版本差异或特定 shell 依赖。

2. 容器与嵌入式环境


在 Docker Alpine 镜像、BusyBox 环境、嵌入式设备或资源受限系统中,bash 可能不可用或占用过多空间。POSIX shell 脚本使用最小化功能集,确保在这些轻量级环境中稳定运行,是容器启动脚本、嵌入式系统初始化脚本的最佳选择。

3. Bash 到 POSIX 迁移


当你需要将现有的 bash 脚本转换为更便携的 POSIX sh 格式时,可以系统性地识别和替换 bash 特有特性(如数组、[[ 条件判断、local 关键字等),并提供可移植的替代方案,同时保持脚本的功能完整性和安全性。

核心功能

1. POSIX 兼容性验证与规范指导


提供严格的 POSIX sh 编码规范,指导开发者避免使用 bash 特有特性(如数组、进程替换、brace expansion、[[ 条件等),并使用 ShellCheck (-s sh)、shfmt (-ln posix) 和 checkbashisms 等工具进行静态分析和格式化,确保脚本符合 POSIX.1-2024 标准。

2. 可移植编程模式


针对 POSIX sh 的限制提供实用的编程模式,包括:使用位置参数和分隔字符串替代数组、使用 [ ] 测试命令替代 [[、使用 . 代替 source、使用 printf 代替 echo、使用 case 进行模式匹配等,同时提供安全错误处理、临时文件管理和参数解析的可移植实现。

3. 多 Shell 测试与 CI 集成


支持在 dash、ash、bash --posix、yash、posh 等多种 POSIX shell 实现上进行矩阵测试,并提供 CI/CD 集成配置(GitHub Actions、Pre-commit hooks),确保脚本在 Linux、macOS、Alpine、BusyBox 等环境中的兼容性,特别适用于容器化部署和嵌入式系统开发。

常见问题

POSIX shell 和 bash 有什么区别?


Bash 是 GNU Bourne Again Shell,是 POSIX sh 的超集,包含许多扩展功能(如数组、[[ 条件、进程替换等)。POSIX sh 是标准化的最小功能集,定义在 IEEE POSIX 标准 中。使用 POSIX sh 编写的脚本可以在任何兼容的 shell 中运行(dash、ash、bash --posix 等),而 bash 脚本依赖 bash 特有功能,移植性较差。

如何检查我的脚本是否符合 POSIX 标准?


使用以下工具进行验证:1)shellcheck -s sh script.sh - 以 POSIX 模式检查脚本;2)shfmt -ln posix -d script.sh - 格式化并检查语法;3)checkbashisms script.sh - 检测 bash 特有结构;4)在不同 shell 中测试:dash script.shash script.shbash --posix script.sh。建议在 CI 中集成这些检查。

为什么脚本在 Alpine Linux 中运行失败?


Alpine Linux 默认使用 BusyBox ash(轻量级 POSIX shell),而不是 bash。如果脚本使用了 bash 特有功能(如数组 arr=()[[ ]] 条件、source 命令、${var//pattern} 替换等),就会失败。解决方法:1)改用 #!/bin/sh shebang;2)使用 POSIX 兼容语法;3)避免 bash 特性;4)使用 shellcheck 和 checkbashisms 检测问题代码。