2015-01-22 4 views
3

Я часто вижу эту команду в программах node.js: NODE_ENV=test node app.js, которая устанавливает переменную NODE_ENV для проверки и работы. Я также читал здесь https://en.wikipedia.org/wiki/Environment_variable, что это должно работать для любой команды оболочки, но работает несколько тестов самостоятельно, вот что я вижуКак установить переменные среды для команды оболочки

$ HELLO="WORLD" 
$ HELLO="MARS" echo "$HELLO" 
    WORLD 
$ 

Я ожидал бы это напечатать MARS. Что-то мне здесь не хватает?

+1

см. Http://unix.stackexchange.com/a/56449 –

+0

HELLO = "MARS"; echo "$ HELLO" –

+0

HELLO = "MARS" bash -c 'echo "$ HELLO"' –

ответ

3

Синтаксис VAR=value command означает, что команда будет вызываться с переменной окружения VAR, установленной в VALUE, и это применимо только к сфере действия этой команды.

Однако, при использовании командной строки:

HELLO="MARS" echo "$HELLO" 

Оболочка первого интерпретирует параметр "$HELLO", определяет, что это WORLD, а затем, что это на самом деле выполняется:

HELLO="MARS" echo "WORLD" 

Таким образом, эхо может иметь набор переменных HELLO, но это не влияет на то, что он печатает - это уже было интерпретировано ранее.

Doing

HELLO="MARS"; echo "$HELLO" 

делает что-то совсем другое. Сначала он устанавливает HELLO в MARS в текущей оболочке, а затем переходит к интерпретации команды echo. К настоящему времени HELLO содержит MARS, а не WORLD. Но это совсем другой эффект - переменная HELLO остается со значением MARS, что не соответствует команде без ;.

Ваша проблема в том, что echo является лишь плохим выбором для демонстрации этого. Вы можете сделать другие демонстрации, чтобы доказать, что HELLO правильно изменился:

HELLO="MARS" eval 'echo $HELLO' 

В этом случае оболочка не будет интерпретировать $HELLO, потому что она находится в пределах строки в одинарных кавычках. Сначала он положит MARS в HELLO, а затем вызовите eval 'echo $HELLO' с этим набором переменных. Команда eval с последующим запуском echo $HELLO, и вы получите результат, который ожидаете.

Этот синтаксис лучше всего использовать для вещей, которые не используют данную переменную как часть командной строки, а используют ее внутренне.

+0

Отличное объяснение! Спасибо. – mmilleruva

0

Другие ответы правильны, но здесь уточнение:

Есть 2 случая на самом деле при определении списка переменных, разделенных пробелами в Баш, заканчивается ли он или нет с командой.

VAR1=value1 VAR2=value2 ... VARn=valuen command arg1 arg2 ... argn 

и

VAR1=value1 VAR2=value2 ... VARn=valuen 

не экспортируют VAR1 ... VARN таким же образом.

В первом случае VAR1 ... VARn будет установлен только для команды и не будет экспортироваться в текущую оболочку.

Во втором случае VAR1 ... VARn изменяет текущую оболочку.

тогда (заметим, что ';' очень же использования новой строки)

HELLO=WORLD 
HELLO=MARS echo "i don't export HELLO." 
echo "HELLO=$HELLO" 

будет отображать

i don't export HELLO. 
HELLO=WORLD 

и

HELLO=WORLD 
HELLO=MARS ; echo "i did export HELLO." 
echo "HELLO=$HELLO" 

покажет

i did export HELLO. 
HELLO=MARS 
Смежные вопросы