为什么\ $减少到$内部反引号[虽然不在$(...)]内?

eze*_*zon 21 unix shell posix

超越POSIX标准,我遇到了另一个相当技术性/毫无意义的问题.它声明:

在反引号的命令替换方式中,<backslash>应保留其字面含义,除非后跟:' $',' `'或<backslash>.

很容易理解为什么' `'和' \'失去了它们的字面含义:嵌套命令替换需要命令替换中的"不同"反引号,这反过来迫使'\'失去其字面含义.因此,例如,以下不同的行为似乎是合理的:

$ echo $(echo \\\\)
\\
$ echo `echo \\\\`
\
Run Code Online (Sandbox Code Playgroud)

但是'$'怎么样?即,有什么意义,或者更具体地说,以下差异可能带来什么好处?

$ echo $(echo \$\$)
$$
$ echo `echo \$\$`
4735
Run Code Online (Sandbox Code Playgroud)

由于'$'本身并不排除在反引号内,看起来你会一直使用'$'或'\\\ $',但绝不会使用中间''$''.

回顾一下,

$ echo `echo $$` # PID, OK
4735
$ echo `echo \\\$\\\$` # literal "$$", OK
$$
$ echo `echo \$\$` # What's the point?
4735
Run Code Online (Sandbox Code Playgroud)

PS:我知道这个问题很技术性......我自己一直在寻找更现代的$(...)替代品,但我仍然很好奇.

Jon*_*len 2

通过添加\,您可以使内部子 shell 而不是外壳扩展它。一个很好的例子是实际强制启动一个新的 shell,如下所示:

$ echo $$
4988
$ echo `sh -c 'echo $$'`
4988
$ echo `sh -c 'echo \$\$'`
4990
$ echo `sh -c 'echo \\\$\\\$'`
$$
Run Code Online (Sandbox Code Playgroud)