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

Jump to content

# Environment variables (Русский)

From ArchWiki
Состояние перевода: На этой странице представлен перевод статьи 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 (Русский)#Файлы Запуска/Завершения.

- 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

The factual accuracy of this article or section is disputed.

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

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

- Gentoo:Handbook:X86/Working/EnvVar
- Ubuntu Community Wiki - Environment Variables

Category:

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

Hidden category:

- Pages or sections flagged with Template:Accuracy