Синтаксис 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
, и вы получите результат, который ожидаете.
Этот синтаксис лучше всего использовать для вещей, которые не используют данную переменную как часть командной строки, а используют ее внутренне.
см. Http://unix.stackexchange.com/a/56449 –
HELLO = "MARS"; echo "$ HELLO" –
HELLO = "MARS" bash -c 'echo "$ HELLO"' –