Переменные оболочки и переменные среды
MY_HOME="/home/my_user"
устанавливает переменную оболочки с именем MY_HOME
. Оболочки являются языками программирования и имеют переменные (также называемые параметрами). После этого присваивания вы можете использовать значение переменной, например, с echo "$MY_HOME"
.
Переменные оболочки - это внутренняя концепция оболочки. Когда этот экземпляр оболочки завершается, 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
is hello *
, то после echo $myvar
печати печатается hello
один пробел, за которым следует список файлов в текущем каталоге. Это почти никогда не желательно, поэтому общий принцип всегда использовать двойные кавычки переменной подстановки (если вы не знаете , что вам нужно PathName расширения или разделения полей): echo "$myvar"
. В случае простого присваивания, othervar=$myvar
в самом деле надежно копирует значение myvar
вothervar
потому что глобализация и разбиение слов запрещены в присваиваниях (потому что они создают несколько слов, но ожидается одно слово). Это разрешение не распространяется на export
, однако. Поэтому, если вы хотите запомнить простое правило, всегда используйте двойные кавычки вокруг подстановок переменных.