Executando o seguinte em uma tela de linha de comando:
bash -c "v=value; echo $v"
não exibe nada. Está certo? Como posso atribuir um valor a uma variável dentro desse tipo de execução?
Executando o seguinte em uma tela de linha de comando:
bash -c "v=value; echo $v"
não exibe nada. Está certo? Como posso atribuir um valor a uma variável dentro desse tipo de execução?
Respostas:
Existem duas conchas envolvidas aqui:
O shell de chamada, o shell interativo a partir do qual você está executando este
O shell não interativo e sem login, gerado por bash -c
Agora, o problema é que, entre aspas duplas, as variáveis são expandidas para seus respectivos valores, isso é verdade para qualquer shell.
Portanto, como você usou aspas duplas, a variável de expansão, $v
na verdade está ocorrendo no shell de chamada, não no shell chamado. Mas a declaração v=value
está ocorrendo no chamado shell não interativo.
Portanto, no total, você tem a variável definida no shell chamado e expandida (anteriormente) 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 fazer com que a definição e expansão da variável ocorra no shell gerado, use aspas simples ou escape $
:
$ bash -c "v=value; echo $v"
$ bash -c 'v=value; echo $v'
value
$ bash -c "v=value; echo \$v"
value
As aspas duplas $v
são substituídas pelo shell interativo. Use aspas simples:
$ bash -c 'v=value;echo $v'
value