Alguém pode explicar exatamente o que está acontecendo com aspas simples e aspas duplas com IDs de processo no exemplo abaixo? [duplicado]

2
[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

Eu entendo que sempre que usamos aspas simples, um novo sub-shell é criado, e o mesmo não acontece com aspas duplas. Por que isso acontece?

    
por rajadhiraja 26.03.2015 / 18:49

2 respostas

2

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.

    
por 26.03.2015 / 19:31
0

As aspas simples são citadas com força, que o bash lê como parâmetros, em vez de uma string como as aspas duplas pretendem. Chamar bash com a opção -c dirá para usar parâmetros não-string como parâmetros posicionais. Como aspas simples não são sequências, elas devem ser interpretadas como instruções posicionais.

link

    
por 26.03.2015 / 19:14

Tags