Параметр и другие типы расширений выполняются при чтении команды перед ее выполнением.
Первая версия, LANG=Ja_JP bash -c "echo $LANG"это отдельная команда. После того, как он проанализирован как таковой, $LANGон расширяется до того, en_USкак что-либо выполнено. По bashзавершении обработки ввода он разветвляется, добавляет LANG=Ja_JPв среду, как ожидалось, и затем выполняет bash -c echo en_US.
Вы можете предотвратить расширение с помощью одинарных кавычек, то есть LANG=Ja_JP bash -c 'echo $LANG'выходов Ja_JP.
Обратите внимание, что когда у вас есть переменное назначение как часть команды, назначение влияет только на среду этой команды, а не на оболочку.
Вторая версия LANG=Ja_JP; bash -c "echo $LANG"- это две отдельные команды, выполняемые последовательно. Первый - это простое присвоение переменной без команды, поэтому оно влияет на вашу текущую оболочку.
Таким образом, ваши два фрагмента принципиально отличаются, несмотря на поверхностное различие одного ;.
Совершенно не по теме, но я мог бы рекомендовать добавить .UTF-8при настройке LANG. В настоящее время нет веской причины не использовать Unicode в 21-м веке.