Existem dois shells envolvidos aqui:
-
O shell de chamada, o shell interativo a partir do qual você está executando este
-
O shell não-login, não interativo, gerado por
bash -c
Agora, o problema é que, entre aspas duplas, as variáveis são expandidas para seus respectivos valores, isso é verdadeiro para qualquer shell.
Portanto, como você usou aspas duplas, a expansão da variável, $v
, está realmente ocorrendo no shell de chamada, não no shell chamado. Mas a declaração, v=value
, está ocorrendo no shell não interativo chamado.
Assim, no total, você tem a variável definida no shell chamado e expandida (antecipadamente) no shell de chamada. Como a variável value não está definida no shell de chamada, você não obtém nada na saída.
Agora, para que a definição e a expansão da variável ocorram no shell gerado, use aspas simples ou escape de $
:
$ bash -c "v=value; echo $v"
$ bash -c 'v=value; echo $v'
value
$ bash -c "v=value; echo $v"
value