Коли використовувати крапку з двокрапкою між змінними середовища та командою


14

Чи може хто-небудь пояснити, чому напівкрапка потрібна для того, LANGщоб бачити, як оновлений баш?

Не працює:

> LANG=Ja_JP bash -c "echo $LANG"
en_US

Працює:

> LANG=Ja_JP ; bash -c "echo $LANG"
Ja_JP

Я працюю з bash 4.1.10 на Linux і тією ж версією під cygwin

Відповіді:


23

Параметри та інші типи розширень виконуються під час зчитування команди перед її виконанням.

Перша версія, 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 столітті.


Чудова відповідь - дякую! Щодо додавання UTF-8. Я намагаюся перевірити локальну обробку програми, яка повинна працювати на декількох платформах, деякі з яких досить старі. Між різницями на кшталт цієї (яку, на щастя, ви пояснили), та різницями щодо Linux та cygwin я збираюся кинутись під шину!
Річард Корден

5

VAR=value; somecommand еквівалентно

VAR=value
somecommand

Це непов'язані команди, що виконуються одна за одною. Перша команда присвоює значення змінної оболонки VAR. Якщо VARвже не є змінною середовища, вона не експортується в навколишнє середовище, вона залишається внутрішньою оболонкою. Заява export VARможе експортувати VARв навколишнє середовище.

VAR=value somecommand- це інший синтаксис. Присвоєння VAR=valueсередовищу, але це призначення виконується лише в середовищі виконання somecommand, а не для подальшого виконання оболонки.

Як приклад:

# Assume neither VAR1 nor VAR2 is in the environment
VAR1=value
echo $VAR1                        # displays "value"
env | grep '^VAR1='               # displays nothing
VAR2=value env | grep '^VAR2='    # displays "VAR2=value"
echo $VAR2                        # displays nothing

Я не дуже думав про різницю між змінною оболонки проти середовища. Мені доведеться пройти кілька досліджень. Дякую за відповідь.
Річард Корден
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.