[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 将告诉它使用非字符串参数作为位置参数。由于单引号不是字符串,因此它们必须被解释为位置语句。