Bash嵌套双引词分裂不一致

时间:2015-03-15 17:26:00

标签: bash nested double-quotes quoting

我一直在搞乱bash引用,并注意到以下奇怪现象似乎表现出不一致的行为,并且想知道是否有人可以解释发生了什么?:

如果我使用嵌套双引号用cp进行测试:

$ filename="file name"
$ cp "/a/path/to/"${filename}"" /tmp
+ cp /a/path/to/file name /tmp
cp: cannot stat '/a/path/to/file': No such file or directory
cp: cannot stat 'name': No such file or directory

好的,所以它的分词 - 如果你考虑"似乎是合理的。字符作为开关的开关,用于引用和从左到右阅读。

有趣的是,这里的分词工作符合预期:

$ cp "/a/path/to/${filename}" /tmp
+ cp '/a/path/to/file name /tmp'
cp: cannot stat '/a/path/to/file name': No such file or directory

好的,那么为什么变量赋值的行为方式不一样呢? e.g。

pathname="/a/path/to/"${filename}"" 

surely should be the same as typing:

$ pathname=/a/path/to/file name
+ pathname=/a/path/to/file
+ name
-bash: name: command not found

但实际发生的是:

$ pathname="/a/path/to/"${filename}""
+ pathname='/a/path/to/file name'

它运作正常吗?!

引用行为似乎在变量和命令之间不一致。

1 个答案:

答案 0 :(得分:1)

这与BASH在整个生产线上的扩展方式有关。

如果您阅读here,您会发现第一步是将任何看似word=word的内容放在一边,然后解析该行的其余部分。

显然是你的

$ pathname="/a/path/to/"${filename}""

被简单地解释为word=word并保存以便稍后在扩展过程中进行处理。当它到达后面的步骤时,它会扩展包含的变量并执行赋值,并最终使 voila 感觉到不一致。