"`command "$variable"`"
将外层引号视为包含内部引号,而不是在引号外展开变量?
我用来测试的确切命令类似于另一个stackoverflow问题中提出的示例,该问题涉及在使用命令替换时引用的正确方法:
fileName="some path with/spaces"
echo "`dirname "$fileName"`"
正确地输出“some path with”,而不是因为参数数量无效而抱怨。
我阅读了Bash的man页面,在“EXPANSION”章节的“Commmand Substitution”部分中,它指出新式的$()替换保留括号内任何字符的含义,然而,关于反引号,它仅提到反斜杠的使用有限:
当使用旧式的反引号替换形式时,反斜杠保留其字面含义,除非后跟$、`或\。第一个未经过反斜杠转义的反引号终止命令替换。
我的第一个想法是反引号也是一样的,除了上述的例外,因此“引用”内部的双引号,但是我被告知这不是事实。 指引我朝这个方向的第二个观察是:
a=\$b
b=hello
echo `echo $a`
这段代码输出"$b"。如果反引号让美元符号被解释,第一个变量替换应该在子shell被调用之前发生,而子shell会扩展字符串"$b",结果是"hello."。 根据上述手册摘录,我甚至可以确保美元符号被引用,方法是使用
echo `echo \$a`
and the results would still be the same.
第三个观察结果让我有些怀疑:
echo `echo \\a`
结果:"\a"
echo \a
结果:a
在这里,似乎两个反斜杠在子shell出现之前都被保留了,尽管man页面说明在反引号内的反斜杠在后面跟着另一个反斜杠时不具有其字面意义。 编辑:^在这方面一切都按预期工作,我一定是使用了错误的shell(在我的其他终端中使用了tcsh,并使用了与“a”不同的字符)。
尽管我还没有找到实际发生了什么,但在寻找答案时,我遇到了一些人提到了与命令替换相关的“引用上下文”术语,但没有解释它是什么或在哪里描述它。 我在Bash参考资料(gnu.org、tldp、man bash)或通过DuckDuckGo没有找到任何关于“引用上下文”的真正参考。
除了知道正在发生什么之外,我更希望有一些参考或指导,以便从中区分出这种行为,因为我认为我可能没有把一些碎片放在一起,这自然而然地发生了。否则我会忘记答案。
对于那些建议人们使用新式美元符号和括号替换的人:在约50年历史的Unix机器上,有数十个或数百个不同的专有环境(不能为新版本的shell扔掉一个旧的),当人们必须编写兼容大多数可能使用的shell的脚本时,这不是一个选项。
感谢任何能帮助我的人。