我一直在搞乱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'
它运作正常吗?!
引用行为似乎在变量和命令之间不一致。
答案 0 :(得分:1)
这与BASH在整个生产线上的扩展方式有关。
如果您阅读here,您会发现第一步是将任何看似word=word
的内容放在一边,然后解析该行的其余部分。
显然是你的
$ pathname="/a/path/to/"${filename}""
被简单地解释为word=word
并保存以便稍后在扩展过程中进行处理。当它到达后面的步骤时,它会扩展包含的变量并执行赋值,并最终使 voila 感觉到不一致。