Я думаю, что Вы смущены терминологией.
"Переменная среды" является просто переменной оболочки, которую наследуют любые дочерние процессы.
То, что Вы делаете в своем примере, создает переменную оболочки. Это не находится в среде, пока Вы не экспортируете его:
MY_HOME="/home/my_user"
export MY_HOME
помещает переменную под названием "MY_HOME" почти во всех оболочках (csh, tcsh исключенный).
В данном случае двойные кавычки являются лишними. Они не имеют никакого эффекта. Подстроки группы двойных кавычек, но позволяет любую оболочку, которую Вы используете, чтобы сделать подстановку переменных. Единственно заключающие в кавычки подстроки групп и предотвращают замену. Так как Ваше присвоение в качестве примера не имеет никаких переменных в нем, двойные кавычки, возможно, появились как одинарные кавычки.
V='some substrings grouped together' # assignment
X="Put $V to make a longer string" # substitution and then assignment
Y=`date` # run command, assign its output
Z='Put $V to make a longer string' # no substition, simple assignment
Ничто не находится в среде, пока Вы не экспортируете ее.
MY_HOME="/home/my_user"
устанавливает названную переменную оболочки MY_HOME
. Оболочки являются языками программирования и имеют переменные (также названный параметрами). После этого присвоения можно использовать значение переменной, например, с echo "$MY_HOME"
.
Переменные Shell являются внутренним понятием оболочки. Когда тот экземпляр оболочки завершается, MY_HOME
забыт. То, о чем каждая программа знает и передает ее детям, является переменными среды.
В оболочке переменные среды и переменные оболочки работают очень похожими способами. То, что на самом деле происходит, - то, что все переменные среды, которые оболочка наследовала от своего родителя, становятся переменными оболочки. С другой стороны переменная оболочки, которая определяется в сценарии оболочки, станет переменной среды при экспорте ее.
export MY_HOME="/home/my_user"
Причина, почему переменные оболочки автоматически не становятся переменными среды, состоит частично в том, что сценарий мог бы случайно использовать имя переменной, это значимо для программы, которую это запускает, и частично просто исторический.
Требуются некоторые очень старые оболочки export
чтобы использоваться каждый раз, Вы изменили имя переменной, но все современные оболочки отслеживают присвоения для переменных среды, так, чтобы следующий отрывок отозвался эхом bar
:
myvar=foo
export myvar
myvar=bar
env | grep '^myvar='
Кроме того, некоторые очень старые оболочки требуемые отдельные команды для myvar=foo
и export myvar
, но все современные оболочки понимают export myvar=foo
.
Можно работать set -a
заставить все присвоения переменной оболочки автоматически экспортировать переменную, так, чтобы myvar=foo
эквивалентно export myvar=foo
если Вы работали set -a
в той оболочке сначала.
Заключение в кавычки является главным образом ортогональным. Если значение, которое Вы присваиваете переменной, не содержит символов, которые специальны для оболочки, Вам не нужны никакие кавычки. Если существуют специальные символы, необходимо защитить их с одинарными кавычками или двойными кавычками или обратными косыми чертами или комбинацией этого. Это идет для обоих плоскость myvar=value
синтаксис и export
утилита.
Существует одно различие между синтаксисом присвоения и export
синтаксис. Оболочка разворачивает результаты подстановок переменных $foo
далее, выполняя поле (слово) разделение и расширение пути (globbing). Это означает что если значение myvar
hello *
, затем echo $myvar
печать hello
сопровождаемый одиночным пробелом, сопровождаемым списком файлов в текущем каталоге. Это почти никогда не желательно, следовательно общий принцип, чтобы всегда использовать двойные кавычки вокруг подстановок переменных (если Вы не знаете о необходимости в расширении пути или полевом разделении): echo "$myvar"
. В случае простого присвоения, othervar=$myvar
на самом деле надежно копирует значение myvar
кому: othervar
, потому что globbing и разделение слова запрещаются в присвоениях (потому что они создают несколько слов, но отдельное слово ожидается). Это разрешение не относится export
,как бы то ни было. Таким образом, если Вы хотите помнить простое правило, просто всегда используйте двойные кавычки вокруг подстановок переменных.