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

Я определил некоторые переменные среды в моем .profile, как это:

MY_HOME="/home/my_user" 

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

Я думаю, вы смущены терминологией.

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

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

 MY_HOME="/home/my_user" export MY_HOME 

помещает переменную с именем «MY_HOME» почти во все оболочки (csh, tcsh excepted).

В этом конкретном случае двойные кавычки являются излишними. Они не действуют. Групповые подстановки с двойными кавычками, но позволяет использовать любую оболочку для замены переменных. Одинарные кавычки группируют подстановки и предотвращают замещение. Поскольку в вашем примере не указаны какие-либо переменные, двойные кавычки могут отображаться как одиночные кавычки.

 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" .

Переменные оболочки – это внутренняя концепция оболочки. Когда этот экземпляр оболочки завершается, 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 в myvar , потому что блокирование и разбиение слов запрещены в назначениях (потому что они создают несколько слов, но ожидается одно слово). Однако это распоряжение не распространяется на export . Поэтому, если вы хотите запомнить простое правило, всегда используйте двойные кавычки вокруг переменных подстановок.