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