Environment variables (Русский)
Переменные окружения — именованные переменные, содержащие текстовую информацию, которую могут использовать запускаемые программы. Такие переменные могут содержать общие настройки системы, параметры графической или командной оболочки, данные о предпочтениях пользователя и многое другое. Значением такой переменной может быть, например, место размещения исполняемых файлов в системе, имя предпочитаемого текстового редактора или настройки системной локали. Новые в Linux пользователи часто находят такой способ хранения настроек неудобным. Однако, переменные окружения позволяют простым и надежным способом передавать настройки сразу для множества приложений.
Утилиты
Пакет coreutils содержит программы printenv и env. Программа printenv позволяет отобразить список текущих переменных окружения:
$ printenv
Программа env может быть использована для запуска команд с указанием нового значения переменной окружения. В следующем примере будет запущен xterm, для которого переменная окружения EDITOR
имеет значение vim
. Такой вызов не затронет переменную окружения EDITOR
в текущем сеансе терминала.
$ env EDITOR=vim xterm
Встроенная в Bash команда set позволяет вам устанавливать значения переменных окружения в текущем сеансе терминала, а также отображать имена и значения переменных окружения текущего сеанса. Для получения дополнительной информации смотрите документацию по команде set.
Чтобы увидеть переменные окружения конкретных процессов, откройте файл /proc/pid/environ
, где pid — числовой идентификатор интересующего процесса. Записи в этом файле отделены друг от друга нулевым байтом (\x0
), который обычно не виден в терминале. Вы можете использовать, например, sed для отображения переменных окружения процесса в более читабельном формате, заменив нулевые байты на переносы строки: sed 's:\x0:\n:g' /proc/$PID/environ
Установка переменных
На системном уровне
Большинство дистрибутивов Linux советуют изменять или добавлять переменные окружения в /etc/profile
или других местах. Имейте в виду, что сразу множество файлов могут содержать переменные окружения и переопределять их, вроде /etc/locale.conf
. По сути, любой скрипт может быть использован для этого, однако, по принятым в UNIX соглашениям, следует использовать для этого только определенные файлы.
Для установки переменных окружения на уровне всей системы можно использовать следующие файлы (каждый со своими ограничениями):
-
/etc/environment
используется модулем pam_env. Он не привязан к командным оболочкам, поэтому скрипты или glob-выражения использовать здесь нельзя. Здесь можно указывать только парыимя=значение
. -
/etc/profile
устанавливает переменные только при логине в командные оболочки. Он может запускать любые скрипты в оболочках, совместимых с Bourne shell. - Файлы настроек, специфичные для конкретных командных оболочек — глобальные файлы для вашей командной оболочки, инициализирует переменные и запускает скрипты. Например, Bash (Русский)#Файлы настроек или Zsh (Русский)#Файлы Запуска/Завершения.
Ниже приведён пример скрипта, который позволяет добавлять каталог ~/bin
пользователя в PATH
. Чтобы это сделать, просто поместите код в один из системных файлов инициализации окружения (/etc/profile
или /etc/bash.bashrc
):
# Если ID пользователя 1000 или больше, каталог ~/bin существует и его ещё нет в $PATH, # то добавляем ~/bin в $PATH. if [[ $UID -ge 1000 && -d $HOME/bin && -z $(echo $PATH | grep -o $HOME/bin) ]] then export PATH="${PATH}:$HOME/bin" fi
На уровне пользователя
Не всегда требуется устанавливать переменные окружения на уровне системы. Например, вы можете добавить ваш каталог /home/пользователь/bin
в PATH
, однако не хотите, чтобы это затрагивало других пользователей системы. Переменные окружения пользователя можно устанавливать во многих других файлах:
- Файлы инициализации командной оболочки, например Bash (Русский)#Файлы настроек или Zsh (Русский)#Файлы Запуска/Завершения.
-
Пользовательские переменные окружения systemd считываются из файлов
~/.config/environment.d/*.conf
.
Например, чтобы добавить каталог в PATH
, поместите следующее в ~/.bash_profile
:
export PATH="${PATH}:/home/пользователь/bin"
Для применения изменений перезайдите в командную оболочку или используйте команду source: $ source ~/.bash_profile
.
- Демон dbus и пользовательский экземпляр systemd не наследуют никакие переменные окружения из мест вроде
~/.bashrc
. Это означает, что, например, активируемые через dbus программы вроде Gnome Files не будут использовать их по умолчанию. Смотрите systemd/Пользователь#Переменные окружения. - Чтение
~/.pam_environment
объявлено устаревшим, и эта возможность будет удалена в будущем.
Графические приложения
Если переменная окружения влияет только на графические приложения, можно ограничить область её применения, установив её только в рамках графического сеанса.
Чтобы установить переменные окружения только для определённого приложения вместо целого сеанса, измените .desktop файл этого приложения. Смотрите Ярлыки приложений#Изменение переменных среды.
Использование скрипта запуска
Некоторые графические окружения (например, KDE Plasma), поддерживают запуск скриптов при входе: можно использовать их для установки переменных окружения. Пример есть в статье KDE (Русский)#Автозапуск приложений.
Окружение Xorg
Установка переменных окружения для сеанса Xorg зависит от того, каким конкретно способом он запускается:
- Большинство экранных менеджеров выполняют source файла xprofile.
- startx и SLiM выполняют xinitrc.
-
XDM выполняет
~/.xsession
; смотрите XDM (Русский)#Определение сеанса.
Хотя конец скрипта зависит от того, какой это файл, а любой расширенный синтаксис зависит от используемой оболочки, базовое использование универсально:
~/.xprofile, ~/.xinitrc или ~/.xsession
... export ПЕРЕМЕННАЯ=значение ...
Окружение Wayland
Так как Wayland не использует Xorg-специфичные файлы, GDM и KDE Plasma вместо них загружают пользовательские переменные окружения systemd.
~/.config/environment.d/envvars.conf
ПЕРЕМЕННАЯ=значение
Другие экранные менеджеры (например, SDDM) пока что не поддерживают это.
На уровне сеанса
Иногда разумно установить переменную окружения только для текущего сеанса. Например, если нужно временно запускать исполняемые файлы из определённого каталога, но не хочется вводить абсолютный путь к каждому из них или редактировать настройки командной оболочки на время работы с ними.
В таком случае можно определить переменную PATH
в текущем сеансе с помощью команды export. Пока командная оболочка продолжает работать, все запускаемые в ней процессы будут использовать изменённое значение переменной.
$ export PATH="${PATH}:/home/my_user/tmp/usr/bin"
С помощью pam_env
PAM-модуль pam_env(8) загружает переменные для прописывания в окружение из этих файлов в указанном порядке: /etc/security/pam_env.conf
, /etc/environment
(и устаревший ~/.pam_environment
).
/etc/environment
должен содержать только простые пары вида ПЕРЕМЕННАЯ=значение
на отдельных строках, наприммер:
EDITOR=nano
/etc/security/pam_env.conf
и ~/.pam_environment
имеют одинаковый формат:
ПЕРЕМЕННАЯ [DEFAULT=значение] [OVERRIDE=значение]
@{HOME}
и @{SHELL}
являются специальными переменными, значение которых берётся из /etc/passwd
. Следующий пример показывает, как использовать переменную HOME
внутри другой переменной:
XDG_CONFIG_HOME DEFAULT=@{HOME}/.config
${HOME}
и ${SHELL}
не связаны с переменными окружения HOME
и SHELL
, по умолчанию они не задаются.Формат также позволяет расширить уже определённые переменные значениями из других переменных с помощью ${ПЕРЕМЕННАЯ}
, например:
GOPATH DEFAULT=${XDG_DATA_HOME}/go
Пары ПЕРЕМЕННАЯ=значение
тоже допускаются, но расширение переменных здесь не поддерживается. Подробнее смотрите pam_env.conf(5).
~/.profile
, ~/.bash_profile
и ~/.zshenv
. Примеры
В этом разделе описываются типовые переменные окружения, используемые в Linux.
-
XDG_CURRENT_DESKTOP
— это переменная freedesktop.org, содержащая список разделённых двоеточиями строк, которыми идентифицируется среда рабочего стола [1]. Стандартные значения —GNOME
,GNOME-Flashback
,KDE
,LXDE
,LXQt
,MATE
,TDE
,Unity
,XFCE
,EDE
,Cinnamon
иPantheon
[2].-
Cinnamon был зарегистрирован позже других сред. В итоге некоторые приложения по-прежнему ожидают старое нестандартное значение
X-CINNAMON
, например Qt [3].
-
Cinnamon был зарегистрирован позже других сред. В итоге некоторые приложения по-прежнему ожидают старое нестандартное значение
-
XDG_SESSION_DESKTOP
похожа наXDG_CURRENT_DESKTOP
, но допускает использование только одной строки. Несмотря на название, переменная не входит в стандарт freedesktop.org.
-
DE
— более старая переменная для обозначения текущей среды рабочего стола (Desktop Environment). Её значения не стандартизированы, но можно ориентироваться на xdg-utils как на справочник типовых значений для многих сред рабочего стола.
-
DESKTOP_SESSION
— ещё одна старая переменная, но используется реже, чемDE
.
-
WINDOW_MANAGER
— переменная, иногда используемая для выбора оконного менеджера, который будет использоваться в среде рабочего стола. Это отличает её от других упомянутых здесь переменных, которые устанавливаются уже выбранным экранным менеджером или средой рабочего стола и используется для чтения другими программами.
-
PATH
содержит список каталогов, разделённых двоеточиями, в которых система ищет исполняемые файлы. Когда обычная команда (например, ls, systemctl или pacman) интерпретируется командной оболочкой (например, bash или zsh), оболочка ищет исполняемый файл с указанным именем в каталогах из этого списка и, если находит, запускает файл, передав ему указанные аргументы командной строки. Чтобы запускать исполняемые файлы, пути к которым не находятся вPATH
, необходимо указывать относительный или абсолютный путь к файлу, например./a.out
или/bin/ls
.
.
) в список PATH
, так как это может спровоцировать случайный запуск вредоносного исполняемого файла.-
HOME
содержит путь к домашнему каталогу текущего пользователя. Эта переменная может использоваться приложениями для определения расположения файлов настроек пользователя, который их запускает.
-
PWD
содержит путь к текущему рабочему каталогу.
-
OLDPWD
содержит путь к предыдущему рабочему каталогу, то есть, значениеPWD
перед последним вызовом cd.
-
TERM
содержит тип запущенного терминала, напримерxterm-256color
. Это используется некоторыми программами, которые хотят знать возможности текущего терминала.
-
MAIL
содержит путь к каталогу, где сохраняется входящая почта. Обычно имеет значение/var/spool/mail/$LOGNAME
.
-
ftp_proxy
иhttp_proxy
содержат адреса прокси-серверов для протоколов FTP и HTTP соответственно:
ftp_proxy="ftp://192.168.0.1:21" http_proxy="http://192.168.0.1:80"
-
MANPATH
содержит список каталогов, которые использует man для поиска man-страниц.
/etc/profile
есть комментарий "Man is much better than us at figuring this out", так что эту переменную обычно стоит не задавать. Смотрите manpath(5).
-
INFODIR
, аналогичноMANPATH
, содержит список каталогов, в которых команда info производит поиск info-страниц, например/usr/share/info:/usr/local/share/info
.
-
TZ
может использоваться для установки временной зоны. Можно ссылаться на файл из/usr/share/zoneinfo/
, напримерTZ=":/usr/share/zoneinfo/Europe/Moscow"
, тогда перед путём к файлу должно стоять двоеточие (смотрите документацию GNU).
Программы по умолчанию
-
SHELL
содержит путь к предпочитаемой командной оболочке текущего пользователя. Имейте в виду, что это не обязательно совпадает с текущей работающей оболочкой, хотя обычно Bash прописывает эту переменную при своём запуске.
-
PAGER
указывает команду для запуска программы постраничного просмотра содержимого текстовых файлов, например,/bin/less
.
-
EDITOR
содержит команду для запуска программы для редактирования текстовых файлов, например/usr/bin/nano
. Также можно задать специальную команду, которая будет выбирать редактор в зависимости от окружения, например, gedit в X или nano в терминале, как в этом примере:
export EDITOR="$(if [[ -n $DISPLAY ]]; then echo 'gedit'; else echo 'nano'; fi)"
-
VISUAL
позволяет указать имя продвинутого текстового редактора для более сложных задач, например, редактирования почты. Это могут бытьvi
, vim, emacs и т. д.
-
BROWSER
содержит команду для запуска веб-браузера. Может быть полезно устанавливать это значение в зависимости от наличия графического окружения:
if [ -n "$DISPLAY" ]; then export BROWSER=firefox else export BROWSER=links fi