Environment variables (Русский)
Переменные окружения — именованные переменные, содержащие текстовую информацию, которую могут использовать запускаемые программы. Такие переменные могут содержать общие настройки системы, параметры графической или командной оболочки, данные о предпочтениях пользователя и многое другое. Значением такой переменной может быть, например, место размещения исполняемых файлов в системе, имя предпочитаемого текстового редактора или настройки системной локали. Новые в Linux пользователи часто находят такой способ хранения настроек неудобным. Однако, переменные окружения позволяют простым и надежным способом передавать настройки сразу для множества приложений.
Утилиты
Пакет coreutils содержит программы printenv
и env
. Чтобы отобразить список текущих переменных окружения, используйте printenv
, которая отобразит имена и значения каждой переменной окружения:
$ 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
Установка переменных
Смотрите также раздел systemd/Пользователь#Переменные окружения.
На системном уровне
Большинство дистрибутивов Linux советуют изменять или добавлять переменные окружения в /etc/profile
или других местах. Имейте в виду, что сразу множество файлов могут содержать переменные окружения и переопределять их, вроде /etc/locale.conf
. По сути, любой скрипт может быть использован для этого, однако, по принятым в UNIX соглашениям, следует использовать для этого только определенные файлы.
Следующие файлы следует использовать для установки переменных окружения на уровне системы: /etc/profile
, /etc/environment
и настройки, специфичные для командных оболочек. Каждый из этих файлов имеет свои ограничения, поэтому следует внимательно выбирать тот, который подходит для ваших целей.
-
/etc/environment
используется модулем PAM-env. Он не привязан к командным оболочкам, поэтому скрипты или glob-выражения использовать здесь нельзя. Здесь можно указывать только парыимя=значение
. Подробнее смотрите pam_env(8) и pam_env.conf(5). -
/etc/profile
устанавливает переменные только при логине в командные оболочки. Он может запускать любые скрипты в оболочках, совместимых с Bourne shell. - Файлы настроек, специфичные для конкретных командных оболочек — глобальные файлы для вашей командной оболочки, инициализирует переменные и запускает скрипты. Например, Bash (Русский)#Файлы настроек или Zsh (Русский)#Файлы Запуска/Завершения.
Ниже приведен пример скрипта, который позволяет добавлять каталог ~/bin
пользователя в PATH
. Чтобы это сделать, просто поместите код в один из системных файлов инициализации окружения (/etc/profile
или /etc/bash.bashrc
):
# If user ID is greater than or equal to 1000 & if ~/bin exists and is a directory & if ~/bin is not already in your $PATH # then export ~/bin to your $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
, однако, не хотите, чтобы это затрагивало других пользователей системы. Переменные окружения пользователя можно устанавливать во многих других файлах:
-
~/.pam_environment
пользовательский аналог файла/etc/security/pam_env.conf
, который используется модулем PAM-env. Смотрите подробнее в pam_env(8) и pam_env.conf(5). - Файлы инициализации командной оболочки, например Bash (Русский)#Файлы настроек или Zsh (Русский)#Файлы Запуска/Завершения.
-
systemd может загружать переменные окружения из
~/.config/environment.d/*.conf
, смотрите environment.d(5) и https://wiki.gnome.org/Initiatives/Wayland/SessionStart.
Например, чтобы добавить каталог в PATH
, поместите следующее в ~/.bash_profile
:
export PATH="${PATH}:/home/пользователь/bin"
Чтобы увидеть изменения перезайдите в командную оболочку, либо используйте команду source: $ source ~/.bash_profile
.
- Демон dbus и пользовательский экземпляр systemd не наследуют никакие переменные окружения из мест вроде
~/.bashrc
. Это означает, что, например, активируемые через dbus программы вроде Gnome Files не будут использовать их по умолчанию. Смотрите systemd (Русский)/User (Русский)#Переменные окружения. - Чтение
~/.pam_environment
объявлено устаревшим, и эта возможность будет удалена в будущем.
Графические приложения
Чтобы установить переменные окружения для графических приложений, вы можете поместить ваши переменные в xinitrc или в xprofile если используется экранный менеджер, например:
~/.xinitrc
export PATH="${PATH}:${HOME}/scripts" export GUIVAR=value
Приложения, работающие в Wayland, могут использовать systemd user environment variables, так как Wayland не использует Xorg-специфичные файлы:
~/.config/environment.d/envvars.conf
PATH=$PATH:$HOME/scripts GUIVAR=value
Чтобы установить переменные окружения только для определённого приложения вместо целого сеанса, измените .desktop файл этого приложение. Смотрите Desktop entries (Русский)#Изменение переменных среды.
На уровне сеанса
Иногда разумно установить переменную окружения только для текущего сеанса. Для этого вы можете создать в своем каталоге скрипт с нужными переменными, который можно будет запустить в любое время с помощью команды source, либо вводить команды для установки переменных окружения самостоятельно, используя команду export, например:
$ export PATH="${PATH}:/home/my_user/tmp/usr/bin"
Примеры
В этом разделе описываются типовые переменные окружения, используемые в Linux.
-
DE
означает имя окружения рабочего стола (Desktop Environment). xdg-open использует это значение для выбора наиболее удобного приложения для открытия файлов, которое предоставляет окружение. Для использования этой возможности может потребоваться установить некоторые пакеты. Для GNOME необходимо установить libgnomeAUR; в Xfce — exo. Типичные значения переменной окружения:gnome
,kde
,xfce
,lxde
иmate
.
- Переменная окружения
DE
должна быть экспортирована перед запуском оконного менеджера, например:
~/.xinitrc
export DE="xfce" exec openbox
- Это позволит xdg-open использовать более удобный exo-open, так как он будет полагать, что запущен в Xfce. Используйте exo-preferred-applications для настройки.
-
DESKTOP_SESSION
. В среде рабочего стола LXDE, когда уDESKTOP_SESSION
установлено значениеLXDE
, xdg-open будет использовать файловые предпочтения из pcmanfm.
-
PATH
содержит список каталогов, разделённых двоеточиями, в которых система ищет исполняемые файлы. Когда обычная команда, например,ls
,rc-update
илиemerge
, интерпретируется командной оболочкой (такой как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"
. When pointing theTZ
variable to a zoneinfo file, it should start with a colon per the GNU manual.
Программы по умолчанию
-
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
Использование 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
.