Handbook:Alpha/Working/EnvVar
Переменные окружения
Введение
Переменная окружения — это именованный объект, который содержит определения, используемые одним или несколькими приложениями. Используя переменные окружения, можно очень легко изменить настройки для одного или нескольких приложений.
Наиболее важные переменные
В следующей таблице перечислен ряд переменных, используемых в системе Linux и описание их использования. Примеры их значений приведены после таблицы.
Variable | Description |
---|---|
PATH | Эта переменная содержит разделенный двоеточиями список каталогов, в которых система ищет исполняемые файлы. Если введенное имя — это исполняемый файл (например, ls, rc-update или emerge), но этот файл не находится в каталоге из списка, то система не будет выполнять его (если только не ввести полный путь к команде, например /bin/ls). |
ROOTPATH | У этой переменной то же назначение, что и у PATH, но в ней содержатся только те каталоги, которые должны быть проверены, когда root-пользователь вводит команду. |
LDPATH | Эта переменная содержит разделенный двоеточиями список каталогов, в которых динамический линковщик ищет библиотеки. |
MANPATH | Эта переменная содержит разделенный двоеточиями список каталогов, в которых команда man ищет страницы man. |
INFODIR | Эта переменная содержит разделенный двоеточиями список каталогов, в которых команда info выполняет поиск страниц info. |
PAGER | Эта переменная содержит путь к программе, используемой для отображения содержимого файлов (таких как less или more). |
EDITOR | Эта переменная содержит путь к программе, используемой для изменения содержимого файлов (таких как nano или vi). |
KDEDIRS | Эта переменная содержит разделенный двоеточиями список каталогов, содержащих специфический материал для KDE. |
CONFIG_PROTECT | Эта переменная содержит разделенный пробелами список каталогов, которые должны быть защищены Portage при обновлении пакетов. |
CONFIG_PROTECT_MASK | Эта переменная содержит разделенный пробелами список каталогов, которые не должны быть защищены Portage при обновлении пакетов. |
Ниже приведен пример, содержащий все эти переменные:
PATH="/bin:/usr/bin:/usr/local/bin:/opt/bin:/usr/games/bin"
ROOTPATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin"
LDPATH="/lib:/usr/lib:/usr/local/lib:/usr/lib/gcc-lib/i686-pc-linux-gnu/3.2.3"
MANPATH="/usr/share/man:/usr/local/share/man"
INFODIR="/usr/share/info:/usr/local/share/info"
PAGER="/usr/bin/less"
EDITOR="/usr/bin/vim"
KDEDIRS="/usr"
# Каталоги, защищаемые во время обновления пакетов.
# Обратная косая черта в конце строк (\) означает, что это одна строка, разделяемая пробелами.
CONFIG_PROTECT="/usr/X11R6/lib/X11/xkb /opt/tomcat/conf \
/usr/kde/3.1/share/config /usr/share/texmf/tex/generic/config/ \
/usr/share/texmf/tex/platex/config/ /usr/share/config"
# Каталоги, которые _не_ защищаются во время обновления пакетов.
CONFIG_PROTECT_MASK="/etc/gconf"
Определение переменных глобально
Каталог env.d
Для централизации определения переменных в Gentoo используется каталог /etc/env.d/. Внутри каталога есть несколько файлов, такие как 50baselayout, gcc/config-x86_64-pc-linux-gnu и так далее, которые содержат переменные, необходимые программе из названия файла.
Например, когда установлен gcc, ebuild создает файл с названием gcc/config-x86_64-pc-linux-gnu, который содержит определения следующих переменных:
GCC_PATH="/usr/x86_64-pc-linux-gnu/gcc-bin/13"
LDPATH="/usr/lib/gcc/x86_64-pc-linux-gnu/13:/usr/lib/gcc/x86_64-pc-linux-gnu/13/32"
MANPATH="/usr/share/gcc-data/x86_64-pc-linux-gnu/13/man"
INFOPATH="/usr/share/gcc-data/x86_64-pc-linux-gnu/13/info"
STDCXX_INCDIR="g++-v13"
CTARGET="x86_64-pc-linux-gnu"
GCC_SPECS=""
MULTIOSDIRS="../lib64:../lib"
Другие дистрибутивы просят пользователя изменять или добавлять такие определения переменных окружения в /etc/profile или в других местах. С другой стороны, в Gentoo очень просто для пользователя (и для Portage) обслуживать и управлять переменными окружения без необходимости обращать внимание на многочисленные файлы, которые содержат переменные окружения.
Например, при обновлении gcc также обновляется связанный с ним файл /etc/env.d/gcc без какого-либо запроса в сторону администратора.
От этого выигрывает как Portage, так и пользователь. Иногда пользователям необходимо установит определенную переменную окружения для всей системы. Например, возьмем переменную http_proxy. Чтобы не возиться с /etc/profile, пользователь может просто создать файл (скажем /etc/env.d/99local) и написать необходимое определения в нём:
http_proxy="proxy.server.com:8080"
Используя один и тот же файл для всех пользовательских переменных можно получить компактный список переменных, которые были определены пользователем самостоятельно.
env-update
Несколько файлов в /etc/env.d/ определяют переменную PATH. Это не ошибка: когда выполняется команда env-update, она добавит другие определения перед обновлением переменного окружения, что позволяет просто добавлять для пакетов (или пользователей) свои собственные настройки переменного окружения без вмешательство в уже существующие значениями.
Сценарий env-update добавляет значения из файлов /etc/env.d/ в алфавитном порядке. Имена файлов должны начинаться с двух десятичных чисел.
09sandbox 50baselayout 51dconf
+------------+----------------+-----------+
CONFIG_PROTECT_MASK="/etc/sandbox.d /etc/gentoo-release /etc/dconf ..."
Объединение переменных происходит не всегда, а только для следующих переменных: ADA_INCLUDE_PATH, ADA_OBJECTS_PATH, CLASSPATH, KDEDIRS, PATH, LDPATH, MANPATH, INFODIR, INFOPATH, ROOTPATH, CONFIG_PROTECT, CONFIG_PROTECT_MASK, PRELINK_PATH, PRELINK_PATH_MASK, PKG_CONFIG_PATH и PYTHONPATH. Для всех остальных переменных используется последнее значение (в алфавитном порядке файлов в /etc/env.d/).
Можно добавить больше переменных к списку объединяемых переменных, добавив имя переменной в одну из переменных COLON_SEPARATED или SPACE_SEPARATED (также внутри файла /etc/env.d/).
При запуске env-update, сценарий создаст все переменные окружения и поместит их в /etc/profile.env (который используется /etc/profile). Кроме того, сценарий на основе значения LDPATH создаст /etc/ld.so.conf. После этого он запустит ldconfig, чтобы пересоздать файл /etc/ld.so.cache, используемый динамическим компоновщиком.
Чтобы увидеть эффект работы env-update сразу после его запуска, выполните следующую команду, чтобы обновить окружение. Пользователи, которые устанавливали Gentoo сами, вероятно, вспомнят эту команду из инструкции по установке:
root #
env-update && source /etc/profile
Команда выше обновит переменные только для текущего терминала, в новых консолях и их потомках. Таким образом, если пользователь работает в X11, ему нужно либо вводить source /etc/profile в каждом новом открытом терминале, либо перезагрузить X, так все новые терминалы получили новые переменные. Если используется менеджер входа, то необходимо стать root и перезагрузить сервис /etc/init.d/xdm.
Нельзя использовать переменные оболочки для определения других переменных. Это означает, что такие вещи как
FOO="$BAR"
(где $BAR это другая переменная) запрещены.Определение переменных локально
Для пользователя
Не всегда нужно определять переменную окружения на глобальном уровне. Например, кому-то может понадобится добавить /home/my_user/bin и текущий рабочий каталог (каталог в котором находится пользователь) в переменную PATH, но не нужно чтобы все другие пользователи получили такой же PATH. Для определения переменной окружения локально, используйте ~/.bashrc или ~/.bash_profile:
# A colon followed by no directory is treated as the current working directory
PATH="${PATH}:/home/my_user/bin:"
Переменная PATH будет обновлена после выхода/входа.
Для сеанса
Иногда необходимы более жесткие ограничения. Например, необходимо использовать двоичные файлы из временного каталога без указания пути к ним или редактирования ~/.bashrc на короткий срок.
В этом случае просто определите переменную PATH для текущей сессии, воспользовавшись командой export. До тех пор пока пользователь не выйдет, переменная PATH будет использовать временные настройки.
root #
export PATH="${PATH}:/home/my_user/tmp/usr/bin"