Использование переменных среды Linux
04.01.2022Многие программы и сценарии используют переменные среды для получения системной информации и хранения временных данных, а также информации о конфигурации. Переменные среды устанавливаются во многих местах в системе Linux, и полезно знать их расположение.
Оболочка Bash использует функцию, называемую переменными среды, для хранения информации о сеансе оболочки и рабочей среде (отсюда имена переменных среды). Эта функция также позволяет хранить данные в памяти, к которой может легко получить доступ любая программа или сценарий, запущенный из оболочки. Это удобный способ хранить необходимые постоянные данные.
В оболочке Bash есть два типа переменных среды:
- Глобальные переменные
- Локальные переменные
В этом разделе описывается каждый тип переменных среды и показано, как их просматривать и использовать.
Глобальные переменные среды
Глобальные переменные среды видны из сеанса оболочки и из любых порожденных дочерних подоболочек. Локальные переменные доступны только в оболочке, которая их создает. Этот факт делает глобальные переменные среды полезными в приложениях, которые создают дочерние подоболочки, которым требуется информация о родительской оболочке.
Система Linux устанавливает несколько глобальных переменных среды при запуске сеанса Bash. (Для получения дополнительных сведений о том, какие переменные запускаются в это время, см. Раздел «Поиск переменных системной среды» далее в этой главе.) В переменных системной среды почти всегда используются все заглавные буквы, чтобы отличать их от переменных, определяемых пользователем.
Чтобы просмотреть глобальные переменные среды, используйте команду env или printenv:
Чтобы отобразить значение отдельной переменной среды, вы можете использовать команду printenv, но не команду env:
Вы также можете использовать команду echo для отображения значения переменной. При ссылке на переменную среды в этом случае вы должны поместить знак доллара ($) перед именем переменной среды:
Использование знака доллара вместе с именем переменной делает больше, чем просто отображение ее текущего значения при использовании с командой echo. Знак доллара перед именем переменной позволяет передавать переменную в качестве параметра различным другим командам:
Как упоминалось ранее, глобальные переменные среды также доступны для подоболочки любого процесса:
В этом примере после создания подоболочки с помощью команды bash отображается текущее значение переменной среды HOME. Для него установлено то же значение /home/christine, что и в родительской оболочке.
Локальные переменные среды
Локальные переменные среды, как следует из их названия, можно увидеть только в том локальном процессе, в котором они определены. Несмотря на то, что они локальные, они так же важны, как и глобальные переменные среды. Фактически, система Linux также по умолчанию определяет стандартные локальные переменные среды. Однако вы также можете определить свои собственные локальные переменные. Как вы могли предположить, они называются определяемыми пользователем локальными переменными.
Попытка увидеть список локальных переменных в интерфейсе командной строки немного сложна. К сожалению, не существует команды, отображающей только эти переменные. Команда set отображает все переменные, определенные для конкретного процесса, включая как локальные, так и глобальные переменные среды, а также пользовательские переменные:
Все глобальные переменные среды, отображаемые с помощью команды env или printenv, появляются в выходных данных команды set. Дополнительные переменные среды — это локальная среда и пользовательские переменные. В вывод команды set также включены локальные функции оболочки, такие как функция _command, перечисленная на предыдущем экране.
Различия между командами env, printenv и set незначительны. Команда set отображает глобальные и локальные переменные среды, пользовательские переменные и локальные функции. Он также сортирует отображение по алфавиту. Env и printenv отличаются от set тем, что они не сортируют переменные и не включают в себя локальные переменные среды, локальные пользовательские переменные или локальные функции оболочки. Используемые в этом контексте env и printenv создают повторяющиеся списки. Однако команда env имеет дополнительные функции, которых нет у printenv, что делает ее немного более мощной командой.
Установка пользовательских переменных
Вы можете установить свои собственные переменные прямо из оболочки Bash. В этом разделе показано, как создавать собственные переменные и ссылаться на них из интерактивной оболочки или программы сценария оболочки.
После запуска оболочки Bash (или создания сценария оболочки) вам разрешается создавать локальные пользовательские переменные, которые видны в процессе оболочки. Вы можете присвоить переменной среды числовое или строковое значение, присвоив переменной значение с помощью знака равенства:
Теперь, когда вам нужно сослаться на значение пользовательской переменной my_variable, просто укажите на нее имя $my_variable.
Если вам нужно присвоить строковое значение, содержащее пробелы, вы должны использовать одинарные или двойные кавычки для обозначения начала и конца строки:
Без кавычек оболочка Bash предполагает, что следующее слово (World) — это еще одна команда для обработки. Обратите внимание, что для определенной вами локальной переменной вы использовали строчные буквы, тогда как все переменные системной среды, которые вы видели до сих пор, использовали прописные буквы.
Стандартное соглашение оболочки Bash — для всех переменных среды использовать заглавные буквы. Если вы создаете локальную переменную для себя и своих собственных сценариев оболочки, используйте строчные буквы. Переменные чувствительны к регистру. Сохраняя ваши определяемые пользователем локальные переменные в нижнем регистре, вы избегаете потенциальной катастрофы, связанной с переопределением системной переменной среды.
Чрезвычайно важно не использовать пробелы между именем переменной, знаком равенства и значением. Если вы добавите пробелы в присвоение, оболочка Bash интерпретирует значение как отдельную команду:
После того, как вы установили локальную переменную, она доступна для использования в любом месте вашего процесса оболочки. Однако, если вы создадите другую оболочку, она будет недоступна в дочерней оболочке:
В этом примере дочерняя оболочка была создана с помощью команды bash. Пользовательская переменная my_variable была недоступна в дочерней оболочке. Это демонстрируется пустой строкой, возвращаемой после команды echo $ my_variable. После выхода из дочерней оболочки и возврата к исходной оболочке локальная переменная стала доступной.
Точно так же, если вы устанавливаете локальную переменную в дочернем процессе, после выхода из дочернего процесса локальная переменная больше не доступна:
Локальная переменная, установленная в дочерней оболочке, не существует после возврата в родительскую оболочку. Вы можете изменить это поведение, превратив локальную пользовательскую переменную в глобальную.
Установка глобальных переменных среды
Глобальные переменные среды видны из любых дочерних процессов, созданных родительским процессом, который устанавливает переменную. Метод, используемый для создания глобальной переменной среды, заключается в том, чтобы сначала создать локальную переменную, а затем экспортировать ее в глобальную среду.
Это делается с помощью команды экспорта и имени переменной (без знака доллара):
После определения и экспорта локальной переменной my_variable дочерняя оболочка была запущена командой bash. Дочерняя оболочка смогла правильно отобразить значение переменной my_variable. Переменная сохранила свое значение, потому что команда экспорта сделала ее глобальной.
Чтобы свести к минимуму набор текста, вы можете установить переменную и экспортировать все в одной команде. Используя предыдущий пример, вы должны ввести export my_variable = ‘I am Global Now’ и нажать Enter в командной строке.
Изменение глобальной переменной среды в дочерней оболочке не влияет на значение переменной в родительской оболочке:
После определения и экспорта переменной my_variable с помощью команды bash была запущена подоболочка. Подоболочка правильно отобразила значение глобальной переменной среды my_variable. Затем дочерняя оболочка изменила значение переменной. Однако значение переменной было изменено только в дочерней оболочке, а не в среде родительской оболочки.
Дочерняя оболочка не может даже использовать команду экспорта для изменения значения глобальной переменной родительской оболочки:
Несмотря на то, что дочерняя оболочка переопределила и экспортировала переменную my_variable, переменная my_variable родительской оболочки сохранила свое исходное значение.