Environment variables (Русский)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Состояние перевода: На этой странице представлен перевод статьи Environment variables. Дата последней синхронизации: 15 сентября 2021. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Переменные окружения — именованные переменные, содержащие текстовую информацию, которую могут использовать запускаемые программы. Такие переменные могут содержать общие настройки системы, параметры графической или командной оболочки, данные о предпочтениях пользователя и многое другое. Значением такой переменной может быть, например, место размещения исполняемых файлов в системе, имя предпочитаемого текстового редактора или настройки системной локали. Новые в 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, однако, не хотите, чтобы это затрагивало других пользователей системы. Переменные окружения пользователя можно устанавливать во многих других файлах:

  1. ~/.pam_environment пользовательский аналог файла /etc/security/pam_env.conf, который используется модулем PAM-env. Смотрите подробнее в pam_env(8) и pam_env.conf(5).
  2. Файлы инициализации командной оболочки, например Bash (Русский)#Файлы настроек или Zsh (Русский)#Файлы Запуска/Завершения.

Например, чтобы добавить каталог в 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

Tango-inaccurate.pngThe factual accuracy of this article or section is disputed.Tango-inaccurate.png

Reason: environment.d(5) затрагивает только пользовательские службы. [1] Чтение переменных окружения из ~/.config/environment.d/ в Wayland-сеансе является поведением, специфичным для GDM. (Discuss in Talk:Environment variables (Русский))

Приложения, работающие в Wayland, могут использовать systemd user environment variables, так как Wayland не использует Xorg-специфичные файлы:

~/.config/environment.d/envvars.conf
PATH=$PATH:$HOME/scripts
GUIVAR=value

Чтобы установить переменные окружения только для определённого приложения вместо целого сеанса, измените .desktop файл этого приложение. Смотрите Desktop entries (Русский)#Изменение переменных среды.

Совет: KDE Plasma поддерживает выполнение скриптов при входе и даже перед запуском Plasma, так что они могут быть использованы для установки переменных окружения. Смотрите KDE (Русский)#Автозапуск приложений.

На уровне сеанса

Иногда разумно установить переменную окружения только для текущего сеанса. Для этого вы можете создать в своем каталоге скрипт с нужными переменными, который можно будет запустить в любое время с помощью команды 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 the TZ 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.

Смотрите также