Environment variables (Русский)

Состояние перевода:
На этой странице представлен перевод статьи
Environment variables
. Дата последней синхронизации: 27 октября 2024. Вы можете
помочь
синхронизировать перевод, если в английской версии произошли
изменения
.
Ссылки по теме
Приложения по умолчанию
systemd/Пользователь#Переменные окружения
Переменная окружения — именованный объект, содержащий текстовую информацию, которую могут использовать запускаемые программы. Проще говоря, это переменная с именем и значением. Значением такой переменной может быть, например, место размещения исполняемых файлов в системе, имя предпочитаемого текстового редактора или настройки системной локали. Новые в Linux пользователи часто находят такой способ хранения настроек неудобным. Однако переменные окружения позволяют простым и надёжным способом передавать настройки сразу для множества приложений.
Утилиты
Пакет
coreutils
содержит программы
printenv
и
env
. Программа
printenv
позволяет отобразить список текущих переменных окружения и их значения:
$ printenv
Примечание
Некоторые переменные окружения относятся к конкретному пользователю в системе. Вы можете убедиться в этом, сравнив выводы команды
printenv
, запущенной обычным пользователем и суперпользователем.
Программа
env
может быть использована для запуска команд с указанием нового значения переменной окружения. В следующем примере будет запущен
xterm
, для которого переменная окружения
EDITOR
имеет значение
vim
. Такой вызов не затронет переменную окружения
EDITOR
в текущем сеансе терминала.
$ env EDITOR=vim xterm
Встроенная в
командную оболочку
команда
set(1p)
позволяет вам устанавливать значения переменных окружения в текущем сеансе терминала, а также отображать имена и значения переменных окружения текущего сеанса.
Чтобы увидеть переменные окружения конкретных процессов, откройте файл
/proc/
pid
/environ
, где
pid
— числовой идентификатор интересующего процесса. Записи в этом файле отделены друг от друга нулевым байтом (
\x0
), который обычно не виден в терминале. Вы можете использовать, например,
sed
для отображения переменных окружения процесса в более читабельном формате, заменив нулевые байты на переносы строки:
sed 's:\x0:\n:g' /proc/$PID/environ
Установка переменных
Чтобы избежать замусоривания переменных окружения, стоит по возможности ограничивать области действия переменных. Кроме того, графические сеансы и службы systemd требуют установки переменных в определённых местах, чтобы они сработали. Область действия переменных окружения разделяется на контексты, на которые они влияют:
системный
— все программы у любых пользователей, кроме служб systemd;
пользовательский
— все программы определённого пользователя, кроме служб systemd (смотрите
systemd/Пользователь#Переменные окружения
) или графических окружений (смотрите раздел
#Графические приложения
).
На системном уровне
С помощью файлов инициализации оболочки
Большинство дистрибутивов Linux советуют изменять или добавлять переменные окружения в
/etc/profile
или других местах. Имейте в виду, что сразу множество файлов могут содержать переменные окружения и переопределять их, вроде
/etc/locale.conf
. По сути, любой скрипт может быть использован для этого, однако по принятым в UNIX соглашениям следует использовать для этого только определённые файлы.
Для установки переменных окружения на уровне всей системы можно использовать следующие файлы (каждый со своими ограничениями):
/etc/environment
используется
модулем pam_env
. Он не привязан к командным оболочкам, поэтому скрипты или glob-выражения использовать здесь нельзя. Здесь можно указывать только пары
имя=значение
.
/etc/profile
устанавливает переменные
только
в оболочках входа (когда пользователь выполняет вход в систему). В нём можно запускать скрипты (например, запускаются скрипты из каталога
/etc/profile.d/
) и он может использоваться в оболочках, совместимых с
Bourne shell
.
Файлы настроек, специфичные для конкретных командных оболочек — глобальные файлы настроек для вашей
командной оболочки
, инициализирует переменные и запускает скрипты. Например,
Bash (Русский)#Файлы настроек
(например,
~/.bashrc
) или
Zsh (Русский)#Файлы запуска/завершения
(например,
~/.zshrc
).
Ниже приведён пример скрипта, который создаёт функцию для добавления нескольких каталогов (например,
~/bin
и
~/scripts
) в
PATH
. Чтобы это сделать, просто поместите код в один из системных файлов инициализации окружения (
/etc/profile
или
/etc/bash.bashrc
):
set_path(){

    # Проверяем, что id пользователя 1000 или больше
    [ "$(id -u)" -ge 1000 ] || return

    for i in "$@";
    do
        # Проверяем существование каталога
        [ -d "$i" ] || continue

        # Проверяем, что его ещё нет в $PATH.
        echo "$PATH" | grep -Eq "(^|:)$i(:|$)" && continue

        # Затем добавляем в $PATH и экспортируем переменную
        export PATH="${PATH}:$i"
    done
}

set_path ~/bin ~/scripts
Одним из способов использования общих переменных окружения в разных оболочках является создание файла
без комментариев, пустых строк и пробелов (bash)
, который может быть прочитан непосредственно программой
envsubst
(вдохновлено
[1]
):
.env
EDITOR=vim
XDG_CACHE_HOME=$HOME/.cache
XDG_CONFIG_HOME=$HOME/.config
XDG_DATA_HOME=$HOME/.local/share
XDG_STATE_HOME=$HOME/.local/state
~/.bashrc
export $(envsubst < .env)
~/.config/fish/config.fish
export (envsubst < .env)
С помощью pam_env
PAM
-модуль
pam_env(8)
загружает переменные для прописывания в окружение из этих файлов в указанном порядке:
/etc/security/pam_env.conf
и
/etc/environment
.
Примечание
Эти файлы считываются перед другими файлами, в частности перед
~/.profile
,
~/.bash_profile
и
~/.zshenv
.
Устаревший файл
~/.pam_environment
больше не считывается. Смотрите
FS#68945
.
/etc/environment
должен содержать только простые пары вида
ПЕРЕМЕННАЯ
=
значение
на отдельных строках, например:
/etc/environment
EDITOR=nano
/etc/security/pam_env.conf
имеет формат:
/etc/security/pam_env.conf
ПЕРЕМЕННАЯ [DEFAULT=
значение
] [OVERRIDE=
значение
]
@{HOME}
и
@{SHELL}
являются специальными переменными, значение которых берётся из
/etc/passwd
. Следующий пример показывает, как использовать переменную
HOME
внутри другой переменной:
/etc/security/pam_env.conf
XDG_CONFIG_HOME   DEFAULT=@{HOME}/.config
Примечание
Переменные
${HOME}
и
${SHELL}
не связаны с переменными окружения
HOME
и
SHELL
, по умолчанию они не задаются.
Формат также позволяет расширить уже определённые переменные значениями из других переменных с помощью
${
ПЕРЕМЕННАЯ
}
, например:
/etc/security/pam_env.conf
GOPATH DEFAULT=${XDG_DATA_HOME}/go
Пары
ПЕРЕМЕННАЯ
=
значение
тоже допускаются, но расширение переменных здесь не поддерживается. Подробнее смотрите
pam_env.conf(5)
.
На уровне пользователя
Не всегда требуется устанавливать переменные окружения на уровне системы. Например, вы можете захотеть добавить свой каталог
/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/Пользователь#Переменные окружения
.
Совет
С помощью команды
export -p
можно просмотреть глобальные и локальные переменные окружения, объявленные для пользовательского сеанса.
Графические приложения
Если переменная окружения влияет только на графические приложения, можно ограничить область её применения, установив её только в рамках графического сеанса. В порядке сужения области:
#На уровне Xorg
или
#На уровне Wayland
— охватывают весь графический сеанс, в том числе наверняка среду рабочего стола;
#На уровне графического сеанса
— охватывает приложения, запущенные в рамках графического сеанса, в том числе, возможно, и среду рабочего стола;
#На уровне приложения
— только для отдельного графического приложения.
На уровне графического сеанса
Некоторые графические окружения (например,
KDE Plasma
), поддерживают запуск скриптов при входе: можно использовать их для установки переменных окружения. Пример есть в статье
KDE (Русский)#Автозапуск приложений
.
На уровне Xorg
Установка переменных окружения для сеанса Xorg зависит от того, каким конкретно способом он запускается:
Большинство
экранных менеджеров
выполняют source файла
xprofile
.
startx
и
SLiM
выполняют
xinitrc
.
XDM
выполняет
~/.xsession
; смотрите
XDM (Русский)#Определение сеанса
.
LightDM
[2]
и
SDDM
[3]
дополнительно выполняет source скриптов оболочек входа, вроде
~/.bash_profile
для
bash
или
~/.zprofile
и
~/.zlogin
для
zsh
.
Хотя конец скрипта зависит от того, какой это файл, а любой расширенный синтаксис зависит от используемой оболочки, базовое использование универсально:
~/.xprofile, ~/.xinitrc или ~/.xsession
...
export
ПЕРЕМЕННАЯ
=
значение
...
На уровне Wayland
Так как
Wayland
не использует Xorg-специфичные файлы,
GDM
и
KDE Plasma
вместо них загружают
пользовательские переменные окружения systemd
.
~/.config/environment.d/envvars.conf
ПЕРЕМЕННАЯ
=
значение
Другие экранные менеджеры (например,
SDDM
) пока что не поддерживают это напрямую. Однако
LightDM
и
SDDM
выполняет source скриптов оболочек входа и для сеансов Wayland тоже.
greetd
также использует
/etc/profile
и
~/.profile
— это поведение контролируется его настройкой
source_profile
, включенной по умолчанию.
Если ваш экранный менеджер выполняет скрипты запуска вроде
~/.bash_profile
и вы хотите использовать
environment.d
, то с помощью
run-parts
можно сделать так:
~/.bash_profile
# использует systemd-environment-d-generator(8) для генерации переменных окружения и экспортирует их
set -o allexport
source <(/usr/lib/systemd/user-environment-generators/30-systemd-environment-d-generator)
set +o allexport
Примечание
Другие генераторы в каталоге
/usr/lib/systemd/user-environment-generators
, например
60-flatpak
, могут не заключать в кавычки значения переменных окружения. В этом случае вывод должен быть получен с помощью
export -- "$(/usr/lib/systemd/user-environment-generators/60-flatpak)"
На уровне приложения
Чтобы установить переменные окружения только для определённого приложения вместо целого сеанса, измените
.desktop
файл этого приложения. Смотрите
Ярлыки приложений#Изменение переменных окружения
.
Для игры из
Steam
можно настроить окружение, отредактировав её
параметры запуска
.
На уровне сеанса или оболочки
Иногда бывает нужно установить временную переменную окружения. Например, если нужно временно запускать исполняемые файлы из определённого каталога, но не хочется вводить абсолютный путь к каждому из них или редактировать настройки командной оболочки на время работы с ними.
В таком случае можно определить переменную
PATH
в текущем сеансе с помощью команды
export
. Пока командная оболочка продолжает работать, все запускаемые в ней процессы будут использовать изменённое значение переменной.
$ export PATH="${PATH}:/home/my_user/tmp/usr/bin"
Примеры
В этом разделе описываются типовые переменные окружения, используемые в Linux.
XDG_CURRENT_DESKTOP
— это переменная
freedesktop.org
, содержащая список разделённых двоеточиями строк, которыми идентифицируется
среда рабочего стола
[4]
. Стандартные значения —
GNOME
,
GNOME-Flashback
,
KDE
,
LXDE
,
LXQt
,
MATE
,
TDE
,
Unity
,
XFCE
,
EDE
,
Cinnamon
,
Pantheon
и
DDE
[5]
.
Cinnamon был зарегистрирован
[6]
[
устаревшая ссылка
2025-11-16 ⓘ]
других сред. В итоге некоторые приложения по-прежнему ожидают старое нестандартное значение
X-CINNAMON
, например
Qt
[7]
[
устаревшая ссылка
2025-03-15 ⓘ]
.
Hyprland
неофициально признан за
Hyprland
.
XDG_SESSION_DESKTOP
похожа на
XDG_CURRENT_DESKTOP
, но допускает использование только одной строки. Несмотря на название, переменная
не входит в стандарт freedesktop.org
.
DE
— более старая переменная для обозначения текущей среды рабочего стола (
D
esktop
E
nvironment). Её значения не стандартизированы, но можно ориентироваться на
xdg-utils
как на справочник типовых значений для многих сред рабочего стола.
DESKTOP_SESSION
— ещё одна старая переменная, но используется реже, чем
DE
. Значение также может быть путём к
файлу .desktop
сеанса в каталоге
/usr/share/xsessions/
[8]
.
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
содержит разделённый двоеточиями список каталогов, которые использует
info
для поиска info-страниц, например
/usr/share/info:/usr/local/share/info
.
TZ
может использоваться для установки временной зоны. Можно ссылаться на файл из
/usr/share/zoneinfo/
, например
TZ=":/usr/share/zoneinfo/Europe/Moscow"
, тогда перед путём к файлу должно стоять двоеточие (смотрите
документацию GNU
).
Программы по умолчанию
SHELL
содержит путь к
предпочитаемой командной оболочке
текущего пользователя. Имейте в виду, что это не обязательно совпадает с текущей работающей оболочкой. Если значение не указано,
Bash
автоматически устанавливает в качестве её значения оболочку входа, прописанную в файле
/etc/passwd
, или
/bin/sh
, если это не удаётся определить.
PAGER
указывает команду для запуска программы постраничного просмотра содержимого текстовых файлов, например,
/bin/less
.
EDITOR
содержит команду для запуска программы для редактирования текстовых файлов, например
/usr/bin/nano
. Также можно задать специальную команду, которая будет выбирать редактор в зависимости от окружения, например,
gedit
в
X
или
nano
в терминале, как в этом примере:
[ -n "$DISPLAY" ] && export EDITOR=gedit || export EDITOR=nano
VISUAL
позволяет указать имя продвинутого текстового редактора для более сложных задач, например, редактирования почты. Это могут быть
vi
,
vim
,
emacs
и т. д.
BROWSER
содержит команду для запуска веб-браузера. Может быть полезно устанавливать это значение в зависимости от наличия графического окружения:
[ -n "$DISPLAY" ] && export BROWSER=firefox || export BROWSER=links
Совет
При прописывании программ по умолчанию также можно ориентироваться на переменную
WAYLAND_DISPLAY
, наличие которой указывает на то, что запущен
Wayland-композитор
.
Смотрите также
Gentoo:Handbook:X86/Working/EnvVar
Ubuntu Community Wiki - Environment Variables