命令替换中的行继续
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。
[
…]
序列的内容实际上是一个脚本,而不仅仅是一个命令(尽管人们大多不利用它,因为他们并不疯狂)。在脚本末尾放置额外的空行不会改变脚本的结果:它是脚本中最后一个命令的结果(除非脚本为空,当它是空字符串时)。
离开 \
字符意味着那里有一个多命令脚本,这是合法的(尽管您没有创建命令 foo
或 bar
)。加入它们意味着您拥有一个相当于以下内容的整体脚本:
set a [list foo bar
]
正是那些空间。这通常与此几乎相同:
set a [list foo bar]
但还是有区别的
给定这个简短的代码片段:
set a [list \
foo \
bar
]
当我在 list
之后删除 \
我得到 invalid command name "foo"
并且当我在 foo
之后删除 \
我得到 invalid command name "bar"
.
但是,我所说的代码运行良好,但我没有得到 invalid command name "]"
.
为什么bar
后不需要\
?
没有错误消息,因为递归计算在右括号处结束。它不是命令替换脚本的一部分。就命令替换中的递归评估而言,这只是一个列表命令,后面有一些白色 space。
[
…]
序列的内容实际上是一个脚本,而不仅仅是一个命令(尽管人们大多不利用它,因为他们并不疯狂)。在脚本末尾放置额外的空行不会改变脚本的结果:它是脚本中最后一个命令的结果(除非脚本为空,当它是空字符串时)。
离开 \
字符意味着那里有一个多命令脚本,这是合法的(尽管您没有创建命令 foo
或 bar
)。加入它们意味着您拥有一个相当于以下内容的整体脚本:
set a [list foo bar
]
正是那些空间。这通常与此几乎相同:
set a [list foo bar]
但还是有区别的