Bash嵌套双引号单词分割不一致

Bash嵌套双引号单词分割不一致,bash,nested,double-quotes,quoting,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

我一直在胡乱引用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

OK,这是分裂的词——如果你认为“字符作为一个开关的开头和左向右读”似乎是合理的。 有趣的是,这里的单词拆分工作与预期的一样:

$ 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}""
+ pathname='/a/path/to/file name'
它很好用


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

这与BASH跨行扩展的方式有关

如果您阅读,您将看到第一步是将任何看起来像
word=word
的内容放在一边,然后解析该行的其余部分

显然是你的

$ pathname="/a/path/to/"${filename}""
它被简单地解释为
word=word
,并保存下来以备以后在扩展过程中处理。当它进入到后面的步骤时,它会扩展包含的变量并进行赋值,最后你会发现一个明显的不一致性。

这也是一个很好的阅读。
$ pathname="/a/path/to/"${filename}""