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