扩展库 / shellwords
shellwords
拆分命令行词法文本,或将参数编码为可安全传递的单个 shell 词。
版本 1.0.0 · C / xlang · 无扩展库依赖
快速开始
import shellwords
var words = shellwords.split("tool 'two words' --flag")
assert words[1] == "two words"
assert shellwords.split(shellwords.join(words))[1] == "two words"
assert shellwords.quote("A=B") == "'A=B'"
println(shellwords.quoteWindows("a b\\"))
本库只处理参数词法,不执行命令,也不做变量、通配符或命令替换。
接口
| 入口 | 用途 |
|---|---|
split(text) | 按空白、引号和反斜杠拆分,保留空参数;不完整引号或转义报错。 |
quote(word) | 按 POSIX shell 的单参数规则引用;赋值词、保留词及尾随冒号的词也整体加引号,避免在命令位置被当作语法。 |
join(words) | 逐项引用字符串数组并用空格连接。 |
quoteWindows(word) | 按 MSVCRT 的 argv 引号与反斜杠规则编码单个参数。 |
quoteWindows 不负责 cmd.exe 的 &、|、% 等元字符,也不是 PowerShell 转义。POSIX C 入口保留非 NUL 的原始参数字节;Windows 入口只处理 CRT 引号,使用 CreateProcessW 时需由调用方转换有效 UTF-8 到 UTF-16。C 端包含 extlibs/shellwords/include/xrt_shellwords.h;拆分结果由调用方用 xrtValueRelease 释放,引用后的字符串用 xrtFree 释放。
验证与边界
POSIX 编码按连续正文片段追加,单引号转义规则及公开 API 不变;不为每字节追加或每个 Join 参数另建临时字符串。新增126组长度/引号/任意非 NUL 字节对照、8条逐点内存故障路径,以及393条由 Python shlex 独立解析的记录;Linux 另用真实 shell 逐字节核对 argv。微基准独立运行,局部速度改善不外推为整个语言或所有负载的保证。
examples/command_plan.xl 与 command_plan_c.c 展示单引号、中文、参数规范化和 Windows CRT 引用,共享六行黄金输出,不执行命令。默认门禁核对输入指纹,设置进程超时并在失败时留存现场;新文本路径测试不替代原语言数组 Join 正例。
xl run release/extlibs/shellwords/examples/basic.c
powershell -NoProfile -ExecutionPolicy Bypass -File release/extlibs/shellwords/test/check.ps1
bash release/extlibs/shellwords/test/check.sh
C 教学范例可直接用 xl 单文件运行;Windows 保留严格 C、分配故障、真实 CreateProcessW/宽字符 CRT 参数往返,Linux 保留 C ASan/UBSan 与真实 /bin/sh。当前发布物的语言数组 join(var words) 仍受共享 foreign var 投影阻断;默认门禁必须通过该正例及完整旧边界/OOM,不将其改为预期失败。独立程序与局部功能的通过记录不能外推为整包签收,最新结果见包内 README 与仓库验收矩阵。此库不提供 cmd.exe 或 PowerShell 转义。