Resumo: O shell executa a substituição de parâmetros em strings entre aspas duplas, mas não em strings entre aspas simples. $$
é o PID do shell, mas o número que você vê depende do qual shell o avalia.
Detalhes: Vamos considerar cada caso, um de cada vez.
[root@localhost ~]# echo $$
16991
16991 é o PID do shell atual: vamos chamá-lo de shell principal.
[root@localhost ~]# bash -c "echo $$"
16991
Quando o shell principal vir "echo $$"
, ele substituirá em 16991% por $$
. Assim, a string passada para bash -c
será echo 16991
. É por isso que 16991 é impresso.
[root@localhost ~]# bash -c 'echo $$'
21062
Como 'echo $$'
tem aspas simples, o shell principal não faz a substituição de parâmetros. A string echo $$
é passada para bash -c
. 21062 é impresso porque é o PID do processo bash -c
.
[root@localhost ~]# bash -c 'echo $$'
21063
Na próxima vez em que você executar o processo bash -c
, ele terá um novo PID, desta vez em 21063.