Environment variables (Русский) - ArchWiki

Jump to content
From ArchWiki
Состояние перевода: На этой странице представлен перевод статьи Environment variables. Дата последней синхронизации: 19 октября 2023. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Ссылки по теме

- Приложения по умолчанию
- 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` должен содержать только простые пары вида `ПЕРЕМЕННАЯ=значение` на отдельных строках, например:

    EDITOR=nano

`/etc/security/pam_env.conf` имеет формат:

    ПЕРЕМЕННАЯ [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).

### На уровне пользователя

Не всегда требуется устанавливать переменные окружения на уровне системы. Например, вы можете захотеть добавить свой каталог `/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 (Русский)#Определение сеанса.
- SDDM дополнительно выполняет source скриптов оболочек входа, вроде `~/.bash_profile` для bash или `~/.zprofile` и `~/.zlogin` для zsh. [2]

Хотя конец скрипта зависит от того, какой это файл, а любой расширенный синтаксис зависит от используемой оболочки, базовое использование универсально:

    ~/.xprofile, ~/.xinitrc или ~/.xsession

    ...
    export ПЕРЕМЕННАЯ=значение
    ...

##### На уровне Wayland

Так как Wayland не использует Xorg-специфичные файлы, GDM и KDE Plasma вместо них загружают пользовательские переменные окружения systemd.

    ~/.config/environment.d/envvars.conf

    ПЕРЕМЕННАЯ=значение

Другие экранные менеджеры (например, SDDM) пока что не поддерживают это напрямую. Однако SDDM выполняет source скриптов оболочек входа и для сеансов Wayland тоже.

Если ваш экранный менеджер выполняет скрипты запуска вроде `~/.bash_profile` и вы хотите использовать `environment.d`, то с помощью run-parts можно сделать так:

    ~/.bash_profile

    # использует systemd-environment-d-generator(8) для генерации переменных окружения и экспортирует их
    export $(run-parts /usr/lib/systemd/user-environment-generators | sed '/:$/d; /^$/d' | xargs)

Примечание: Этот код запускает все исполняемые файлы в каталоге `/usr/lib/systemd/user-environment-generators`, что может быть как желательным, так и нежелательным. Если нужно, запускайте `/usr/lib/systemd/user-environment-generators/30-systemd-environment-d-generator` напрямую.

##### На уровне приложения

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

Для игры из Steam можно настроить окружение, отредактировав её параметры запуска.

### На уровне сеанса или оболочки

Иногда бывает нужно установить временную переменную окружения. Например, если нужно временно запускать исполняемые файлы из определённого каталога, но не хочется вводить абсолютный путь к каждому из них или редактировать настройки командной оболочки на время работы с ними.

В таком случае можно определить переменную `PATH` в текущем сеансе с помощью команды export. Пока командная оболочка продолжает работать, все запускаемые в ней процессы будут использовать изменённое значение переменной.

    $ export PATH="${PATH}:/home/my_user/tmp/usr/bin"

## Примеры

В этом разделе описываются типовые переменные окружения, используемые в Linux.

- `XDG_CURRENT_DESKTOP` — это переменная freedesktop.org, содержащая список разделённых двоеточиями строк, которыми идентифицируется среда рабочего стола [3]. Стандартные значения — `GNOME`, `GNOME-Flashback`, `KDE`, `LXDE`, `LXQt`, `MATE`, `TDE`, `Unity`, `XFCE`, `EDE`, `Cinnamon`, `Pantheon` и `DDE` [4].
  - Cinnamon был зарегистрирован позже других сред. В итоге некоторые приложения по-прежнему ожидают старое нестандартное значение `X-CINNAMON`, например Qt [5].

- `XDG_SESSION_DESKTOP` похожа на `XDG_CURRENT_DESKTOP`, но допускает использование только одной строки. Несмотря на название, переменная не входит в стандарт freedesktop.org.

- `DE` — более старая переменная для обозначения текущей среды рабочего стола (Desktop Environment). Её значения не стандартизированы, но можно ориентироваться на xdg-utils как на справочник типовых значений для многих сред рабочего стола.

- `DESKTOP_SESSION` — ещё одна старая переменная, но используется реже, чем `DE`. Значение также может быть путём к файлу .desktop сеанса в каталоге `/usr/share/xsessions/` [6].

- `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

Category:

- System administration (Русский)