有人可以准确解释下面示例中带有进程 ID 的单引号和双引号发生了什么吗?

有人可以准确解释下面示例中带有进程 ID 的单引号和双引号发生了什么吗?
[root@localhost ~]# echo $$
16991
[root@localhost ~]# bash -c "echo $$"
16991
[root@localhost ~]# bash -c "echo $$"
16991
[root@localhost ~]# bash -c 'echo $$'
21062
[root@localhost ~]# bash -c 'echo $$'
21063
[root@localhost ~]# bash -c 'echo $$'
21064
[root@localhost ~]# bash -c "echo $$"
16991

据我所知,每当我们使用单引号时,就会创建一个新的子 shell,而使用双引号则不会发生同样的情况。为什么会这样呢?

答案1

概括: shell 对双引号中的字符串执行参数替换,但是不是在单引号中的字符串上。 $$是 shell PID,但您看到的数字取决于哪个shell 对其进行评估。

细节: 让我们一次一个地考虑每一种情况。

[root@localhost ~]# echo $$
16991

16991 是当前 shell 的 PID:我们称之为主 shell。

[root@localhost ~]# bash -c "echo $$"
16991

当主shell看到时"echo $$",它将替换为16991 $$。因此,传递给的字符串bash -c将为echo 16991.这就是打印 16991 的原因。

[root@localhost ~]# bash -c 'echo $$'
21062

由于'echo $$'有单引号,主 shell 不进行参数替换。该字符串echo $$被传递到bash -c.打印21062是因为它是进程的PID bash -c

[root@localhost ~]# bash -c 'echo $$'
21063

下次运行该bash -c进程时,它会有一个新的 PID,这次是 21063。

答案2

单引号是强引号,bash 将其作为参数读取,而不是像双引号那样读取字符串。使用 -c 选项调用 bash 将告诉它使用非字符串参数作为位置参数。由于单引号不是字符串,因此它们必须被解释为位置语句。

http://tldp.org/LDP/abs/html/bash-options.html

相关内容