В системах Linux для хранения и использования некоторых настроек и параметров используются специализированные контейнеры данных — переменные окружения. Они представляют собой именованные переменные, в которых хранится текстовое значение. В качестве значения могут использоваться пути, имена команд, файлов и. т. д. Переменные окружения можно редактировать, т. е. изменять их значения, удалять или создавать новые. Переменными окружения пользуются как система, так и программы, скрипты или демоны для своей работы.
Зачем нужны переменные окружения?
Если коротко, то они необходимы для организации различного рода окружений: системных, пользовательских, сеансовых, т. е. для хранения настроек соответствующих сред внутри системы. К примеру, программы для своей работы используют библиотечные функции, являющиеся одним из важнейших системных ресурсов. Или, например, интерпретатор команд способен находить соответствующие командам исполняемые файлы без необходимости каждый раз указывать соответствующие пути.
Но как программы «узнают», где можно найти те или иные ресурсы? Из переменных окружения. Таким же образом происходит запуск и исполнение команд в командной консоли, т. к. благодаря переменной окружения PATH интерпретатор bash (или любая другая командная оболочка) находит программу (исполняемый файл или библиотеку) по указанному в PATH пути. И таким же образом, к примеру, команда man «знает», что запрашиваемые страницы справочных руководств нужно искать согласно значению переменной окружения MANPATH.
Получение информации о переменных окружения
В работе, тесно связанной с системным администрированием довольно часто приходится сталкиваться с такими ситуациями, когда необходимо узнать значения некоторых переменных окружения или же вывести список полный список таковых. Для этой цели существует несколько специализированных утилит. В подавляющем большинстве случаев соответствующие пакеты уже предустановлены в системе. Самыми распространёнными из таких утилит являются printenv, env, а также export. Так, например, для того, чтобы вывести список действующих переменных окружения нужно дать следующую команду:
$ printenv GS_LIB=/home/john/.fonts KDE_FULL_SESSION=true LANG=ru_RU.UTF-8 DISPLAY=:0 OLDPWD=/home/john/builds/wxwidgets PWD=/home/john HOME=/home/john . . . SHELL=/bin/bash PATH=/opt/wxwidgets/bin:/home/john/.config/composer/vendor/bin:/usr/bin
В данном выводе представлен сильно сокращённый список переменных окружения для Kubuntu 18.04. Также следует заметить, что представленный список относится к пользовательскому набору, доступному текущему пользователю. Если выполнить команду printenv от имени суперпользователя (root), то набор переменных будет несколько отличаться.
Как следует из вышеприведённого вывода, для пользователя john используется русская локализация для сеанса (LANG), в качестве командного интерпретатора по-умолчанию используется bash (SHELL), текущим активным каталогом является /home/john (PWD), а переменная PATH модифицирована и содержит в себе (кроме дефолтного /usr/bin) значения /opt/wxwidgets/bin и /home/john/.config/composer/vendor/bin. Значение каждой переменной окружения представляет собой, как можно видеть, набор параметров, разделённых двоеточиями.
Тот же список можно вывести, если дать команду env. Также можно использовать команду export с ключом -p:
$ export -p
Для вывода значения конкретной переменной:
$ echo $PATH
или:
$ printenv | grep PATH
В последнем случае будет выведены все переменные, содержащие фразу «PATH».
Виды переменных окружения
Как уже отмечалось, в системе существуют, образно выражаясь, различные рабочие среды для разных уровней доступа и продолжительности действия переменных. Для организации работы пользователей действует пользовательская среда (окружение), для корректного функционирования компонентов системы — системное окружение, доступное только суперпользователю. В процессе работы также можно устанавливать временные переменные окружения, доступные текущему пользователю и только на время действия текущего сеанса.
Ниже приведены некоторые наиболее часто используемые переменные окружения:
Имя | Описание |
HOME | Определяет путь к домашнему каталогу текущего пользователя |
PWD | Определяет текущий активный каталог |
OLDPWD | Предыдущий активный каталог |
SHELL | Определяет программу-командную оболочку |
TERM | Содержит имя текущей запущенной программы-терминала |
PAGER | Определяет программу для постраничного вывода страниц справочных руководств |
EDITOR | Определяет программу для редактирования текстовых файлов |
VISUAL | Определяет программу для редактирования текстовых файлов с расширенными возможностями (vim, emacs) |
Определяет путь к каталогу, в котором должны храниться файлы входящей электронной почты. | |
BROWSER | Определяет веб-браузер, запускаемый по-умолчанию |
ftp_proxy
http_proxy |
Определяют, соответственно адреса для прокси-серверов по FTP и HTTP протоколам |
MANPATH | Определяет каталог, в котором содержатся подкаталоги, содержащие man-страницы справочных руководств системной справки для команды man |
INFODIR | Определяет список каталогов для поиска info-страниц для команды info |
TZ | Определяет временную зону. Доступные временные зоны хранятся в /usr/share/zoneinfo |
Системные переменные
Согласно стандартам Linux переменные окружения для организации системной среды хранятся в нескольких файлах:
- /etc/bash.bashrc – хранение переменных для командных оболочек;
- /etc/profile – хранение переменных для интерактивных оболочек;
- /etc/environment – переменные из этого файла используются модулем
Конечно, подобное разделение для хранения переменных окружения сделано разработчиками не просто так и эти стандарты необходимо соблюдать, чтобы не замусорить систему бесполезной конфигурацией, вносящей путаницу, т. е. нужно внимательно выбирать нужный файл в зависимости от конкретной задачи и ситуации.
Пользовательские переменные
Для систем, ориентированных на многопользовательский доступ, например на хостинговых площадках, конкретному пользователю полезно иметь возможность гибко настраивать своё собственное рабочее окружение, создавая новые переменные или дополняя их новыми значениями. К примеру, владельцу сайта, для его виртуального хоста, обслуживающего сайт на CMS Drupal, захотелось установить утилиту drush, которая облегчает и ускоряет обслуживание CMS. В этом случае достаточно после локальной установки (в каком-нибудь подкаталоге домашнего каталога) drush, дополнить переменную PATH значением, содержащим путь к утилите drush в файле ~/.bashrc. В результате командная оболочка сможет запускать команду drush для данного пользователя.
По стандартам соглашений для Linux-систем конфигурация для пользовательского окружения должна храниться в следующих файлах:
- ~/.bashrc – для хранения параметров инициализации выбранной командной оболочки для пользователя;
- ~/.profile – для инициализации доступных пользователю командных оболочек;
- ~/.pam_environment – для использования модулем
Временные или переменные сеанса
Переменные окружения также можно устанавливать временно. Это значит, что переменная будет действовать только во время действия текущего сеанса пользователя. В таких случаях удобно иметь определённый скрипт, содержащий код с необходимыми переменными, который можно в любое время запускать командой:
$ source файл_скрипта
Или же устанавливать их вручную командой export.
Установка переменных окружения
Чтобы установить временную (для сеанса) переменную окружения достаточно выполнить команду со следующим синтаксисом:
ИМЯ=’значение’
Например:
$ SOMEVAR=’somevalue’ $ echo $SOMEVAR somevalue
Если нужно временно модифицировать переменную PATH, то можно выполнить export:
$ export PATH="${PATH}:/home/john/tmp/usr/bin"
Для того, чтобы удалить временную переменную можно воспользоваться командой unset:
$ unset SOMEVAR
Для установки системных или пользовательских переменных окружения следует помещать код с нужными переменными в соответствующие файлы инициализации окружения. Например, чтобы добавить на системном уровне какой-либо пользовательский каталог (пусть это будет ~/bin), нужно один из файлов (/etc/profile или /etc/bash.bashrc) дополнить следующим кодом:
export PATH=”$HOME/bin:$PATH”
В случае, если нужно выполнить то же самое для пользовательского уровня переменных окружения, то редактировать нужно файл (для локального входа) ~/.bashrc (для удалённого входа, например по SSH – ~/.bash_profile):
export PATH=”$HOME/.config/composer/vendor/bin:$PATH”
Этот код включит использование командным интерпретатором вышеупомянутой команды drush (предварительно установленной по указанному пути, конечно) для CMS Drupal.
Чтобы можно было видеть сделанные изменения, нужно их зафиксировать:
$ source ~/.bashrc
Первый из пяти сайтов, где дано понятное трактование переменного окружения. СПАСИБО!