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