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 que ele for analisado como tal, $LANG
será expandido para en_US
antes que qualquer coisa seja executada. Quando o bash
terminar de processar a entrada, ela bifurcará um processo, adicionará LANG=Ja_JP
ao ambiente como esperado e, em seguida, executará bash -c echo en_US
.
Você pode impedir a expansão com aspas simples, ou seja, LANG=Ja_JP bash -c 'echo $LANG'
outputs 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 seqüência. A primeira é uma atribuição de variável simples sem um comando, por isso afeta seu shell atual.
Assim, seus dois trechos são fundamentalmente diferentes, apesar da distinção superficial de um único ;
.
Completamente fora do tópico, mas eu recomendo acrescentar um .UTF-8
ao definir LANG
. Não há nenhuma boa razão hoje em dia para não usar Unicode no século 21.