Параметри та інші типи розширень виконуються під час зчитування команди перед її виконанням.
Перша версія, 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 столітті.