1

为什么在大括号引号内,您必须转义所有大括号(不应计入嵌套),但在括号替换内,您不必转义所有括号(不应计入嵌套) )。

puts "}" ;# ok in top-level (1)
if {1} {puts "}"} ;# but not ok when inside a brace quote (2)

puts {]} ;# ok in top-level (3)
set output [puts {]}] ;# and still ok inside a bracket substitution (4)
4

1 回答 1

4

当解释器{在单词的开头遇到时,它会查找匹配}以获取单词(要执行的命令名称或要发送给命令的参数之一)。

但是当解释器遇到未转义的 时[,它不会寻找匹配的]。它停止解析脚本本身并递归调用另一个解释器。该解释器开始解析[. 当它{在示例 4 中找到 时,它会启动引用模式,因此将]视为普通字符。

那么为什么不在遇到时递归调用解释器{,并摆脱示例 2 中的大括号问题呢?因为你用大括号引用的词并不总是一个脚本,即使是,它也可能不应该立即运行。大括号引用必须准确;解析器不能像脚本解析器那样根据字符是否在里面等"来区别对待它们。[]

于 2013-01-05T08:17:49.660 回答