arch-wiki-md-repo
Version:
All arch-wiki articles in markdown format, updated every two days.
186 lines (115 loc) • 17.7 kB
Markdown
Переменные окружения — именованные переменные, содержащие текстовую информацию, которую могут использовать запускаемые программы. Такие переменные могут содержать общие настройки системы, параметры графической или командной оболочки, данные о предпочтениях пользователя и многое другое. Значением такой переменной может быть, например, место размещения исполняемых файлов в системе, имя предпочитаемого текстового редактора или настройки системной локали. Новые в Linux пользователи часто находят такой способ хранения настроек неудобным. Однако, переменные окружения позволяют простым и надежным способом передавать настройки сразу для множества приложений.
## Contents
* [1 Утилиты](#.D0.A3.D1.82.D0.B8.D0.BB.D0.B8.D1.82.D1.8B)
* [2 Примеры](#.D0.9F.D1.80.D0.B8.D0.BC.D0.B5.D1.80.D1.8B)
* [3 Установка переменных](#.D0.A3.D1.81.D1.82.D0.B0.D0.BD.D0.BE.D0.B2.D0.BA.D0.B0_.D0.BF.D0.B5.D1.80.D0.B5.D0.BC.D0.B5.D0.BD.D0.BD.D1.8B.D1.85)
* [3.1 На системном уровне](#.D0.9D.D0.B0_.D1.81.D0.B8.D1.81.D1.82.D0.B5.D0.BC.D0.BD.D0.BE.D0.BC_.D1.83.D1.80.D0.BE.D0.B2.D0.BD.D0.B5)
* [3.2 На уровне пользователя](#.D0.9D.D0.B0_.D1.83.D1.80.D0.BE.D0.B2.D0.BD.D0.B5_.D0.BF.D0.BE.D0.BB.D1.8C.D0.B7.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8F)
* [3.2.1 Графические приложения](#.D0.93.D1.80.D0.B0.D1.84.D0.B8.D1.87.D0.B5.D1.81.D0.BA.D0.B8.D0.B5_.D0.BF.D1.80.D0.B8.D0.BB.D0.BE.D0.B6.D0.B5.D0.BD.D0.B8.D1.8F)
* [3.3 На уровне сеанса](#.D0.9D.D0.B0_.D1.83.D1.80.D0.BE.D0.B2.D0.BD.D0.B5_.D1.81.D0.B5.D0.B0.D0.BD.D1.81.D0.B0)
* [4 Смотрите также](#.D0.A1.D0.BC.D0.BE.D1.82.D1.80.D0.B8.D1.82.D0.B5_.D1.82.D0.B0.D0.BA.D0.B6.D0.B5)
## Утилиты
Пакет [coreutils](https://www.archlinux.org/packages/?name=coreutils) содержит программы `printenv` и `env`. Чтобы отобразить список текущих переменных окружения, используйте `printenv`, которая отобразит имена и значения каждой переменной окружения:
```
$ printenv
```
**Примечание:** Некоторые переменные окружения относятся к конкретному пользователю в системе. Вы можете убедиться в этом, сравнив вывод команды `printenv` для обычного пользователя и для суперпользователя.
Программа `env` может быть использована для запуска команд с указанием нового значения переменной окружения. В следующем примере будет запущен *xterm*, для которого переменная окружения `EDITOR` имеет значение `vim`. Такой вызов не затронет переменную окружения `EDITOR` в текущем сеансе терминала.
```
$ env EDITOR=vim xterm
```
Встроенная в [Bash](/index.php/Bash "Bash") команда *set* позволяет вам устанавливать значения переменных окружения в текущем сеансе терминала, а также отображать имена и значения переменных окружения текущего сеанса. Для получения дополнительной информации, смотрите [документацию по команде set](http://www.gnu.org/software/bash/manual/bash.html#The-Set-Builtin).
Чтобы увидеть переменные окружения конкретных процессов, откройте файл `/proc/*pid*/environ`, где *pid* — числовой идентификатор интересующего процесса. Записи в этом файле разделены специальными символами `\x0`, которые не отображаются на экране. Вы можете использовать следующую функцию, которая позволяет отобразить переменные окружения процесса, заменяя эти символы на переносы строки:
```
# envof() { sed 's/\x0/
/g' /proc/${1}/environ; }
```
Например, для вывода переменных окружения процесса с `pid=1`, наберите:
```
# envof 1
TERM=linux
```
## Примеры
В этом разделе описываются типовые переменные окружения, используемые в Linux.
* `DE` содержит имя окружения рабочего стола (*D*esktop *E*nvironment). [xdg-open](/index.php/Xdg-open "Xdg-open") использует это значение для выбора наиболее удобного приложения для открытия файлов, которое предоставляет окружение. Для использования этой возможности может потребоваться установить некоторые пакеты. Для GNOME необходимо установить [libgnome](https://aur.archlinux.org/packages/libgnome/); в Xfce — [exo](https://www.archlinux.org/packages/?name=exo). Типичные значения переменной окружения: `gnome`, `kde`, `xfce`, `lxde` и `mate`.
Переменная окружения `DE` должна быть экспортирована перед запуском оконного менеджера, например:
`~/.xinitrc`
```
export DE="xfce"
exec openbox
```
Это позволит *xdg-open* использовать более удобный *exo-open*, так как он будет полагать, что запущен в Xfce. Используйте *exo-preferred-applications* для настройки.
* `DESKTOP_SESSION`. В среде рабочего стола [LXDE](/index.php/LXDE "LXDE"), когда у `DESKTOP_SESSION` установлено значение `LXDE`, *xdg-open* будет использовать файловые предпочтения из *pcmanfm*.
* `PATH` содержит список каталогов, в которых система ищет исполняемые файлы. Когда обычная команда, например, `ls`, `rc-update` или `emerge`, интерпретируется командной оболочкой (такой как `bash` или `zsh`), оболочка ищет исполняемый файл с указанным именем в этом списке, и, если находит, запускает файл, передав ему указанные аргументы командной строки. Чтобы запускать исполняемые файлы, пути к которым не находятся в `PATH`, необходимо указывать полный путь к файлу, например `/bin/ls`.
**Примечание:** Из соображений безопасности, не рекомендуется включать текущий каталог (`.`) в список `PATH`, так как это может спровоцировать случайный запуск вредоносного исполняемого файла.
* `HOME` содержит путь к домашнему каталогу текущего пользователя. Эта переменная может использоваться приложениями для определения расположения файлов настроек пользователя, который их запускает.
* `PWD` содержит путь к рабочему каталогу.
* `OLDPWD` содержит путь к предыдущему рабочему каталогу, то есть, значение `PWD` перед последним вызовом *cd*.
* `SHELL` содержит имя текущей командной оболочки, например, `bash`.
* `TERM` содержит имя запущенной программы-терминала, например `xterm`.
* `PAGER` указывает команду для запуска программы постраничного просмотра содержимого текстовых файлов, например, `/bin/less`.
* `EDITOR` содержит команду для запуска программы для редактирования текстовых файлов, например `/usr/bin/nano`. Также можно задать специальную команду, которая будет выбирать редактор в зависимости от окружения, например, *gedit* в [X](/index.php/Xorg "Xorg") или *nano* в терминале, как в этом примере:
```
export EDITOR="$(if [[ -n $DISPLAY ]]; then echo 'gedit'; else echo 'nano'; fi)"
```
* `VISUAL` позволяет указать имя продвинутого текстового редактора для более сложных задач, например, редактирования почты. Это могут быть `vi`, [vim](/index.php/Vim "Vim"), [emacs](/index.php/Emacs "Emacs") и т. д.
* `MAIL` содержит путь к каталогу, где сохраняется входящая почта. Обычно имеет значение `/var/spool/mail/$LOGNAME`.
* `BROWSER` содержит команду для запуска веб-браузера. Может быть полезно устанавливать это значение в зависимости от наличия графического окружения:
```
if [ -n "$DISPLAY" ]; then
export BROWSER=firefox
else
export BROWSER=links
fi
```
* `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-страниц](/index.php/Man_page_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9) "Man page (Русский)"). Стандартным значением является `/usr/share/man:/usr/local/share/man`.
* `INFODIR`, аналогично `MANPATH`, содержит список каталогов, в которых команда *info* производит поиск info-страниц. Стандартным значением является `/usr/share/info:/usr/local/share/info`.
* `TZ` может использоваться для установки временной зоны. Доступные временные зоны можно найти в `/usr/share/zoneinfo/`, например `TZ="/usr/share/zoneinfo/Pacific/Fiji"`.
## Установка переменных
Смотрите также раздел [Systemd/User#Environment variables](/index.php/Systemd/User#Environment_variables "Systemd/User").
### На системном уровне
Большинство дистрибутивов Linux советуют изменять или добавлять переменные окружения в `/etc/profile` или других местах. Имейте в виду, что сразу множество файлов могут содержать переменные окружения и переопределять их. По сути, любой скрипт может быть использован для этого, однако, по принятым в UNIX соглашениям, следует использовать для этого только определенные файлы.
Следующие файлы следует использовать для установки переменных окружения на уровне системы: `/etc/profile`, `/etc/bash.bashrc` и `/etc/environment`. Каждый из этих файлов имеет свои ограничения, поэтому следует внимательно выбирать тот, который подходит для ваших целей.
* `/etc/profile` устанавливает переменные *только* для командных оболочек. Он может запускать любые скрипты в оболочках, совместимых с [Bourne shell](https://en.wikipedia.org/wiki/Bourne_shell "wikipedia:Bourne shell").
* `/etc/bash.bashrc` устанавливает переменные *только* для интерактивных оболочек. Он также запускает bash-скрипты.
* `/etc/environment` используется модулем PAM-env. Здесь можно указывать только пары `*имя=значение*`.
Ниже приведен пример скрипта, который позволяет добавлять каталог `~/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=$HOME/bin:${PATH}
fi
```
### На уровне пользователя
Вам не всегда нужно будет устанавливать переменные окружения на уровне системы. Например, вы можете добавить ваш каталог `/home/*пользователь*/bin` в `PATH`, однако, не хотите, чтобы это затрагивало других пользователей системы. Переменные окружения пользователя можно устанавливать во многих других файлах:
1. Файлы инициализации командной оболочки, например [Bash#Configuration files](/index.php/Bash#Configuration_files "Bash") или [Zsh#Configuration files](/index.php/Zsh#Configuration_files "Zsh").
2. `~/.profile` используется также многими оболочками, смотрите [Wikipedia:Unix_shell#Configuration files for shells](https://en.wikipedia.org/wiki/Unix_shell#Configuration_files_for_shells "wikipedia:Unix shell").
3. `~/.pam_environment` пользовательский аналог файла `/etc/environment`, который используется модулем PAM-env. Смотрите подробнее в `pam_env(8)`.
Например, чтобы добавить каталог в `PATH`, поместите следующее в `~/.bash_profile`:
```
export PATH="${PATH}:/home/*пользователь*/bin"
```
Чтобы увидеть изменения перезайдите в командную оболочку, либо используйте команду *source*: `$ source ~/.bash_profile`.
#### Графические приложения
Чтобы установить переменные окружения для графических приложений, вы можете поместить ваши переменные в [xinitrc](/index.php/Xinitrc "Xinitrc"), например:
`~/.xinitrc`
```
export PATH="${PATH}:~/scripts"
export GUIVAR=value
```
### На уровне сеанса
Иногда разумно установить переменную окружения только для текущего сеанса. Для этого вы можете создать в своем каталоге скрипт с нужными переменными, который можно будет запустить в любое время с помощью команды *source*, либо вводить команды для установки переменных окружения самостоятельно, используя команду *export*, например:
```
$ export PATH="${PATH}:/home/my_user/tmp/usr/bin"
```
## Смотрите также
* [Документация Gentoo Linux](http://www.gentoo.org/doc/en/handbook/handbook-x86.xml?full=1#book_part2_chap5)
* [Default applications](/index.php/Default_applications "Default applications")
* [xdg-open (Русский)](/index.php/Xdg-open_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9) "Xdg-open (Русский)")