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

ls -1a|egrep -v '^(\.|\.\.)$'
19
09.07.2011, 02:30
2 ответа

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

"Переменная среды" является просто переменной оболочки, которую наследуют любые дочерние процессы.

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

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

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

23
27.01.2020, 19:44

Переменные Shell по сравнению с переменными среды

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

18
27.01.2020, 19:44
  • 1
    Можете Вы объяснять, что "Заключение в кавычки является главным образом ортогональным". в разделе "On quoting"? Я не получаю значение ортогональных в том предложении. А-ч –  DK Bose 11.03.2014, 08:48
  • 2
    @DKBose Это означает, что среда по сравнению с переменными оболочки, с одной стороны, и заключающий в кавычки, с другой стороны, является двумя отдельными вопросами, которые имеют мало общего друг с другом. Значения Wiktionary 4 и 5. –  Gilles 'SO- stop being evil' 11.03.2014, 11:55

Теги

Похожие вопросы