命令替换中的行继续

Line continuation in command substitution

给定这个简短的代码片段:

set a [list \
  foo \
  bar
]

当我在 list 之后删除 \ 我得到 invalid command name "foo" 并且当我在 foo 之后删除 \ 我得到 invalid command name "bar" .

但是,我所说的代码运行良好,但我没有得到 invalid command name "]".

之类的东西

为什么bar后不需要\

没有错误消息,因为递归计算在右括号处结束。它不是命令替换脚本的一部分。就命令替换中的递归评估而言,这只是一个列表命令,后面有一些白色 space。

[] 序列的内容实际上是一个脚本,而不仅仅是一个命令(尽管人们大多不利用它,因为他们并不疯狂)。在脚本末尾放置额外的空行不会改变脚本的结果:它是脚本中最后一个命令的结果(除非脚本为空,当它是空字符串时)。

离开 \ 字符意味着那里有一个多命令脚本,这是合法的(尽管您没有创建命令 foobar)。加入它们意味着您拥有一个相当于以下内容的整体脚本:

set a [list  foo  bar
]

正是那些空间。这通常与此几乎相同:

set a [list foo bar]

但还是有区别的