Parâmetros e outros tipos de expansões são executados quando o comando é lido, antes de ser executado.
A primeira versão,, LANG=Ja_JP bash -c "echo $LANG"
é um único comando. Depois de analisado como tal, $LANG
é expandido para en_US
antes de qualquer coisa ser executada. Uma vez que bash
está terminado o processamento da entrada, ele bifurca um processo, acrescenta LANG=Ja_JP
ao ambiente como esperado, e então executa bash -c echo en_US
.
Você pode impedir a expansão com aspas simples, ou seja, LANG=Ja_JP bash -c 'echo $LANG'
saídas Ja_JP
.
Observe que, quando você tem uma atribuição de variável como parte de um comando, a atribuição afeta apenas o ambiente desse comando e não o do seu shell.
A segunda versão, LANG=Ja_JP; bash -c "echo $LANG"
na verdade , são dois comandos separados executados em sequência. A primeira é uma atribuição simples de variável sem um comando, portanto afeta o shell atual.
Assim, seus dois trechos são fundamentalmente diferentes, apesar da distinção superficial de um único ;
.
Completamente fora do tópico, mas recomendo anexar a .UTF-8
quando definir LANG
. Atualmente, não há uma boa razão para não usar o Unicode no século XXI.