Vamos ver o que realmente acontece aqui:
$ set -x
$ bash -c "var=3; echo $var"
+ bash -c 'var=3; echo '
Com set -x
você obtém um rastreamento de quais comandos são realmente executados (use set +x
para desativá-lo). Aqui vemos que a variável $var
é expandida para uma string vazia antes de o child bash -c
shell ser executado.
Isso se deve à citação dupla do argumento para bash -c
, que solicitará que o shell atual faça uma expansão variável dentro da string. Como a variável var
é indefinida ou vazia no shell atual, sua expansão é a string vazia.
Para proteger uma string de "interferência" pelo shell, use aspas simples:
$ bash -c 'var=3; echo $var'
+ bash -c 'var=3; echo $var'
3
... ou escape do $
(IMO não é tão bom):
$ bash -c "var=3; echo \$var"
+ bash -c 'var=3; echo $var'
3