Каково значение одинарных и двойных кавычек в переменных среды?


19

Я определил некоторые переменные окружения в моем .profile следующим образом:

MY_HOME="/home/my_user"

но переменная, похоже, не оценивается, если я не скину кавычки и не получу файл заново. Я полагаю, что кавычки необходимы, если будут пробелы, и одинарные кавычки используются, если экранирование нежелательно. Может ли кто-то прояснить значение одинарных и двойных кавычек в определениях переменных? Как насчет передних и задних тиков?

Ответы:


23

Я думаю, что вы не понимаете терминологию.

«Переменная окружения» - это просто переменная оболочки, которую наследуют любые дочерние процессы.

В вашем примере вы создаете переменную оболочки. Это не в среде, пока вы не экспортируете это:

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

Ничто не находится в окружающей среде, пока вы не экспортируете это.


18

Переменные оболочки и переменные среды

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, однако. Поэтому, если вы хотите запомнить простое правило, всегда используйте двойные кавычки вокруг подстановок переменных.


Можете ли вы объяснить, "Цитирование в основном ортогонально". в разделе «О цитировании»? Я не понимаю значение ортогональности в этом предложении.
ДК Бозе

1
@DKBose Это означает, что переменные окружения и оболочки, с одной стороны, и кавычки, с другой, - это две отдельные проблемы, которые имеют мало общего друг с другом. Викисловорные значения 4 и 5.
Жиль "ТАК - перестань быть злым"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.