Los parámetros y otros tipos de expansiones se realizan cuando se lee el comando, antes de ejecutarse.
La primera versión, LANG=Ja_JP bash -c "echo $LANG"es un comando único. Después de que se analiza como tal, $LANGse expande en_USantes de que se ejecute nada. Una vez bashque termina de procesar la entrada, se bifurca un proceso, se agrega LANG=Ja_JPal entorno como se esperaba y luego se ejecuta bash -c echo en_US.
Puede evitar la expansión con comillas simples, es decir, LANG=Ja_JP bash -c 'echo $LANG'salidas Ja_JP.
Tenga en cuenta que cuando tiene una asignación variable como parte de un comando, la asignación solo afecta el entorno de ese comando y no el de su shell.
La segunda versión, en LANG=Ja_JP; bash -c "echo $LANG"realidad , son dos comandos separados ejecutados en secuencia. La primera es una asignación de variable simple sin un comando, por lo que afecta a su shell actual.
Por lo tanto, sus dos fragmentos son fundamentalmente diferentes a pesar de la distinción superficial de uno solo ;.
Completamente fuera de tema, pero podría recomendar agregar un .UTF-8al configurar LANG. No hay una buena razón hoy en día para no usar Unicode en el siglo XXI.