
CLI开发工具【免费下载链接】fish-shellThe user-friendly command line shell.项目地址https://gitcode.com/GitHub_Trending/fi/fish-shell点击查看免费下载string unescape是 fish-shell 内置字符串处理命令族stringbuiltin中负责展开unescape转义序列的子命令功能上与string escape恰好互逆escape把任意字符串转换为可安全用于eval、变量名、URL 或正则的形态unescape则把这些编码后的形态还原为原始字符串。本文以 string-unescape.rst 为骨架结合其上游说明文档 string-escape.rst 与仓库中crates/common的底层实现完整讲解语法、--style各取值、失效输入的处理规则、源码级解码原理及测试验证方法。读完本文你将能熟练使用string unescape完成「编码→解码」的往返操作并理解其在 fish 内部词法解析中的角色。功能定位string escape的逆操作string unescape与string escape配对使用。先看escape的语法见 string-escape.rststring escape [-n | --no-quoted] [--style] [STRING ...] string unescape [--style] [STRING ...]escape按多种方式将每个STRING转义--stylescript默认修改字符串使其可以回传给eval并重新产生原始参数。默认会转义所有特殊字符并在可能时用引号简化输出若指定-n/--no-quoted则不使用简化引号格式。退出状态至少成功转义一个字符串返回 0否则返回 1。--stylevar通过十六进制编码所有非字母数字字符保证字符串可作变量名使用。编码前先把字符串转换为 UTF-8。--styleurl通过十六进制编码 URL 中不合法的字符保证字符串可作 URL 使用。编码前同样先转 UTF-8。--styleregex为在正则表达式中进行字面匹配而转义输入字符串编码前先转 UTF-8。而string unescape正是执行上述过程的逆向操作。文档明确给出了其不变量If the string to be unescaped is not properly formatted it is ignored. For example, doingstring unescape --stylevar (string escape --stylevar $str)will return the original string. There is no support for unescaping--styleregex.即格式不正确的输入会被直接忽略escape --stylevar与unescape --stylevar组合必然还原原串regex 风格没有对应的 unescape 实现——因为正则转义如\.在语义上无法被无歧义地还原。语法与参数说明string unescape的完整形式string unescape [--style] [STRING ...]--style可选取值script默认、var、url。传入其他值会报错详见下文「失效输入与错误处理」。STRING ...零个或多个待解码的字符串不提供任何字符串时同样按失败处理。从源码 unescape.rs 可以看到参数解析的细节const LONG_OPTIONS: static [WOptionstatic] [ // FIXME: this flag means nothing, but was present in the C code // should be removed wopt(L!(no-quoted), NoArgument, n), wopt(L!(style), RequiredArgument, NON_OPTION_CHAR), ]; const SHORT_OPTIONS: static wstr L!(n);注意两个值得说明的实现事实兼容性的-n/--no-quoted选项仍然被解析parse_opt中n self.no_quoted true但源码注释明确标注这是一个从 C 时代遗留下来的、已无实际意义的选项FIXME: this flag means nothing解码流程不会使用它。也就是说string unescape -n不会报错但行为与不带该选项完全一致。--style是必带参数的选项RequiredArgument解析后通过TryFromwstr将字符串转换为内部枚举。三种解码风格script / var / urlunescape的命令分发逻辑在 crates/common/src/lib.rs 的unescape_string()函数中pub fn unescape_string(input: wstr, style: UnescapeStringStyle) - OptionWString { match style { UnescapeStringStyle::Script(flags) unescape_string_internal(input, flags), UnescapeStringStyle::Url unescape_string_url(input), UnescapeStringStyle::Var unescape_string_var(input), } }对应枚举定义pub enum UnescapeStringStyle { Script(UnescapeFlags), Url, Var, }其中script风格携带一组UnescapeFlagsspecial、incomplete、no_backslashes用于控制词法级解码行为url与var则是纯字节级十六进制解码。script词法级反解最贴近 shell 语义--stylescript默认走unescape_string_internal()它本质上是 fish 词法分析tokenizer对「未加引号单词」的逆向逐字符扫描输入处理反斜杠转义、单引号、双引号并把 shell 特殊字符还原为内部表示\开头进入unescape_one()处理反斜杠转义序列例如\n、\x07等未加引号状态下遇到~且位于单词起始位置会还原为家目录符号%self被识别并还原为进程自引用标记*还原为通配符内部标记连续**合并为递归通配符$还原为变量展开标记$(形式的命令替换除外{、}还原为花括号展开标记并记录花括号配对位置。也就是说script风格解码后得到的字符串带有 fish 内部解释层使用的标记字符它还原的并非「直接可显示的普通文本」而是「与原转义字符串等价的、待解释的 token 内容」。这正是它适合配合eval往返使用的原因。url%XX百分号解码unescape_string_url()实现如下见 crates/common/src/lib.rs输入中遇到%时读取其后的两个十六进制字符并合成一个字节遇到%%则还原为单个%若%后缺少合法十六进制位如%位于字符串末尾解码失败返回None任何大于\u{7F}的字符即非 ASCII都会导致返回None因为 URL 风格的转义产物按定义应只含 ASCII 字符。由此escape --styleurl产生的%C3%B6UTF-8 编码的ö能被正确还原为ö而手写的不规范%序列则会被整体忽略。var_前缀十六进制解码unescape_string_var()实现见 crates/common/src/lib.rs规则与url风格对称_后跟两位合法大写十六进制字符时解码为一个字节例如_C3_B6_→ö__还原为单个下划线__后既不是下划线也不是合法十六进制字符时该_被保留它只是编码产物中用于提升可读性的分隔符若_出现在字符串末尾且此前发生过十六进制编码则正常结束解码否则视为意外结尾返回None与非 ASCII 输入同理解码产物应为纯 ASCII 输入非法字符直接失败。这套规则与escape --stylevar的编码规则字母数字保留、其余字节转为_XX_形式精确对称从而保证string unescape --stylevar (string escape --stylevar $str)的无损往返。实战示例与往返验证文档给出的基础示例见 string-escape.rst_ echo \x07 | string escape \cg\x07BEL 控制字符被转义为可见的\cg。反向操作即可取回原字符_ echo \x07 | string escape | string unescape # 输出 BEL 控制字符不可见仓库测试 tests/checks/string.fish 提供了成体系的往返用例可直接复现# 多字节字符的 url / var 往返 string escape --styleurl aöb | string unescape --styleurl # CHECK: aöb string escape --styleurl 中 | string unescape --styleurl # CHECK: 中 string escape --stylevar aöb | string unescape --stylevar # CHECK: aöb string escape --stylevar 中 | string unescape --stylevar # CHECK: 中 # 含引号、井号、通配符、反斜杠等特殊字符的 script 往返 string unescape --stylescript (string escape --stylescript a b#c\d) # CHECK: a b#cd # 含换行的 url 往返 string unescape --styleurl (string escape --styleurl \na\nb%c~d\n) # CHECK: a # CHECK: b%c~d # 含下划线与换行的 var 往返 string unescape --stylevar (string escape --stylevar a\nghi_) # CHECK: a # CHECK: ghi_ # 纯字母数字、下划线、连字符的 var 往返 string unescape --stylevar (string escape --stylevar abc) # CHECK: abc string unescape --stylevar (string escape --stylevar _a_b_c_) # CHECK: _a_b_c_ string unescape --stylevar -- (string escape --stylevar -- -) # CHECK: -把这些用例串成脚本可以直观验证「编码→解码」的幂等性escape --stylevar会把a b#cd变成带_20_、_23_等编码的形式而unescape --stylevar又将其完整还原。失效输入与错误处理unescape对无法正确解码的输入采取「静默忽略、整体失败」的策略这一点在文档与源码中均有体现单条输入解码失败被忽略unescape_string()对每个输入返回Option返回None表示格式非法。命令主循环见 unescape.rs 的handle只会在unescape_string返回Some时才把结果写入输出流并计数。退出状态由成功条数决定只要至少解码成功一个字符串命令返回 0一个都未成功包括未提供参数、所有输入均非法则返回STATUS_CMD_ERROR即状态 1。这一行为与escape的退出约定对称。未知 style 直接报错TryFromwstr见 crates/common/src/lib.rs只接受script、var、url其他取值返回Err(L!(Invalid escape style))。测试覆盖了这一路径string unescape --styleunknown-style # CHECKERR: string unescape: Invalid style value unknown-style不支持 regex 的解码--styleregex的escape产物如\.ext、\^在unescape中没有对应风格传入--styleregex会得到Invalid style value错误。这是有意设计正则转义失去原上下文后不可无歧义还原。在 string 命令族中的位置与底层调用链string unescape是 fish 内置string命令的子命令分发入口之一。在 src/builtins/string.rs 中注册mod unescape; // ... unescape unescape::Unescape::default().run(parser, streams, args),调用链可归纳为用户输入string unescape --style... STRING ...Unescape::handle()通过arguments()迭代器逐个读取参数每个参数调用fish_common::unescape_string(arg, style)底层按风格分发到unescape_string_internal/unescape_string_url/unescape_string_var成功的结果追加到标准输出逐行追加换行符并累计成功计数依据成功计数决定退出状态 0 或 1。值得一提的是unescape_string_internal并非仅供命令使用它与 fish 补全机制共享底层词法逻辑源码注释中提到补全机制会传入不完整的 token 片段花括号配对此时不作硬性断言是 fish 把「外部编码字符串」重新接入其内部解析模型的关键基础设施。小结string unescape是string escape的逆向命令支持script默认、var、url三种风格regex风格不支持解码script走词法级还原反斜杠转义、引号、通配符、变量与花括号展开标记url走%XX解码var走_XX_解码三者底层实现分别在 crates/common/src/lib.rs 的unescape_string_internal、unescape_string_url、unescape_string_var格式非法的输入被静默忽略全部失败时命令返回状态 1未知--style值直接报Invalid style value错误使用string unescape --stylevar (string escape --stylevar $str)这类组合即可实现无损往返相关用例可在 tests/checks/string.fish 中完整复现。赞分享CLI开发工具【免费下载链接】fish-shellThe user-friendly command line shell.项目地址https://gitcode.com/GitHub_Trending/fi/fish-shell点击查看免费下载相关推荐fish-shell 内置命令 echo 完全指南输出文本、转义序列与参数行为详解fish shell 内置命令 echo 完全指南输出文本、转义序列与参数行为详解 导读 echo 是 fish shell 中最常用的内置命令之一用于向终CLI开发工具fish shell string match 命令详解Glob 与 PCRE2 正则匹配实战指南fish shell string match 命令详解Glob 与 PCRE2 正则匹配实战指南 string match 是 fish shell 内置的CLI开发工具fish-shell解析器命令解析的实现原理fish shell解析器命令解析的实现原理 引言为什么需要深入了解fish shell解析器 你是否曾经在使用shell时遇到过命令语法错误却不知道具CLI开发工具上一篇深度解析screenfull全屏API封装从跨浏览器兼容到高级应用实战下一篇如何3步掌握开源火箭设计与飞行仿真从零到专业的模型火箭仿真指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考