为什么在大括号引号中,你必须逃避所有大括号(不应该在嵌套中计算),但在括号替换中,你不必全部逃避括号(不应计入嵌套)。
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)
答案 0 :(得分:4)
当解释器在单词的开头遇到{
时,它会查找匹配的}
来获取单词(要执行的命令名称或发送到命令的其中一个参数)
但是当翻译遇到未转义的[
时,它不会查找匹配的]
。它停止解析脚本本身并递归调用另一个解释器。该解释器开始解析[
之后的字符。当它在示例4中找到{
时,它会开始引用模式,因此]
被视为普通字符。
那么为什么不在遇到{
时递归调用解释器,并摆脱示例2中的大括号问题?因为你用大括号引用的单词并不总是一个脚本,即使它是,它可能不应该马上运行。大括号引用必须准确;解析器不能根据它们是否在"
,[]
等内部来区别对待,就像脚本解析器一样。