在我的 .bashrc 文件中,我有以下内容:
export USER_HOME1='/home/$(id -nu)/'
export USER_HOME2='/home/'$(id -nu)'/'
export USER_HOME3="/home/$(id -nu)/"
export USER_HOME4="/home/\$(id -nu)/"
命令替换仅适用于 USER_HOME2 和 USER_HOME3。它对 USER_HOME2 有何作用?
在单引号内,“$”被视为文字字符,而不具有任何特殊含义。 在双引号内,某些字符具有特殊含义,如果我们需要按字面意思使用它们,则需要转义它们。 这可以解释为什么命令替换在 USER_HOME3 中有效,但在 USER_HOME1 和 USER_HOME4 中无效。
USER_HOME2 如何工作? shell 如何知道如何配对单引号? 它是否有效地连接了三个字符串:“/home/”、$(id -nu) 的输出和“/”? 在这种情况下,我们可以将 USER_HOME2 重写为
export USER_HOME2=/home/$(id -nu)/
USER_HOME2 如何工作? shell 如何知道如何配对单引号?它是否有效地连接了三个字符串:“/home/”、$(id -nu) 的输出和“/”?在这种情况下,我们可以将 USER_HOME2 重写为
是的,这正是正在发生的事情。从 shell 的角度来看,以下字符串都是相同的:
abc
'abc'
"abc"
'a'b'c'
"a"b"c"
''abc''
'ab''c'
'ab'"c"
命令替换必须用双引号引起来,否则全局扩展将应用于结果(除非它出现在参数赋值的右侧;在这种情况下,不会应用进一步的扩展)