Переменные среды

Обновлено 7 ноября 2026

Страница актуальна для Portage 3.0.82 и Calculate Utilities 3.8.

Введение

Переменная среды — это именованный объект, содержащий информацию, которую используют одно или несколько приложений. С помощью переменных среды можно легко менять настройку одной или нескольких программ.

Важные примеры

В следующей таблице перечислен ряд переменных, используемых в системе Linux, и описано их назначение. Примеры значений приведены после таблицы.

Переменная Описание
PATH Список каталогов через двоеточие, в которых система ищет исполняемые файлы. Если введено имя исполняемого файла (например, ls, rc-update или emerge), которого нет ни в одном из перечисленных каталогов, система его не выполнит — если только команда не задана полным путём, например /bin/ls.
ROOTPATH Та же функция, что у PATH, но перечислены только каталоги, которые просматриваются при вводе команд пользователем с правами root.
LDPATH Список каталогов через двоеточие, в которых динамический компоновщик ищет библиотеки.
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"
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="/etc /usr/share/config /var/bind /var/calculate/etc"
# Каталоги, которые НЕ защищаются при обновлении пакетов.
CONFIG_PROTECT_MASK="/etc/gconf"

Глобальное определение переменных

Каталог /etc/env.d

Для централизованного определения этих переменных в Calculate Linux служит каталог /etc/env.d. В нём лежит немало файлов — например, 50baselayout или gcc/config-x86_64-pc-linux-gnu: каждый содержит переменные, нужные программе, указанной в его названии.

Так, при установке sys-devel/gcc ebuild создаёт файл /etc/env.d/gcc/x86_64-pc-linux-gnu-16, где 16 — номер версии компилятора:

/etc/env.d/gcc/x86_64-pc-linux-gnu-16
GCC_PATH="/usr/x86_64-pc-linux-gnu/gcc-bin/16"
LDPATH="/usr/lib/gcc/x86_64-pc-linux-gnu/16:/usr/lib/gcc/x86_64-pc-linux-gnu/16/32"
MANPATH="/usr/share/gcc-data/x86_64-pc-linux-gnu/16/man"
INFOPATH="/usr/share/gcc-data/x86_64-pc-linux-gnu/16/info"
STDCXX_INCDIR="g++-v16"
CTARGET="x86_64-pc-linux-gnu"
GCC_SPECS=""
MULTIOSDIRS="../lib64:../lib"

В том же каталоге лежит /etc/env.d/gcc/config-x86_64-pc-linux-gnu с единственной строкой CURRENT=x86_64-pc-linux-gnu-16 — в ней указана текущая версия компилятора.

Другие дистрибутивы часто предлагают системному администратору менять или добавлять определения переменных среды в /etc/profile или других местах. Calculate, напротив, упрощает сопровождение переменных среды и работу с ними Portage: не нужно следить за множеством файлов, в которых они могут содержаться.

Например, когда sys-devel/gcc обновляется, связанные файлы в /etc/env.d/gcc обновляются автоматически, без участия администратора.

Иногда администратору всё же нужно задать переменную глобально — например, http_proxy. Вместо правки /etc/profile создайте файл /etc/env.d/99local и запишите определение в него:

/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, обновите среду текущей сессии:

env-update && source /etc/profile

Только для текущей сессии

Приведённая команда обновляет переменные лишь в текущем терминале, новых консолях и их потомках. Если вы работаете в X11, выполняйте source /etc/profile в каждом новом терминале или перезапустите X, чтобы все новые терминалы получили обновлённые значения. При использовании диспетчера входа нужно стать пользователем с правами root и перезапустить службу /etc/init.d/xdm.

Без подстановки одних переменных в другие

При определении переменных нельзя использовать переменные оболочки: запись вида FOO="$BAR", где BAR — другая переменная, не сработает.

Переменные для отдельных пакетов

По умолчанию при сборке пакетов используются переменные среды, определённые в make.conf, — например CFLAGS и MAKEOPTS. Иногда отдельным пакетам нужны другие значения. В Calculate файл /etc/portage/package.env по умолчанию отсутствует — создайте его самостоятельно.

Portage поддерживает такие настройки через файлы окружения: /etc/portage/package.env содержит список пакетов, для которых нужны отклоняющиеся переменные, и идентификатор набора; формат строки — <пакет> <идентификатор>. Имя идентификатора выбирается свободно, и Portage ищет файл с точно таким же (с учётом регистра) именем в каталоге /etc/portage/env. Этот механизм дополняет каталожную структуру /etc/portage/make.conf, описанную на странице Настройка с помощью переменных.

Чтобы включить отладочные флаги сборки для отдельного пакета, задайте переменные в файле /etc/portage/env/debug-cflags (имя файла отражает назначение набора). Если каталога /etc/portage/env ещё нет, создайте его:

mkdir /etc/portage/env

/etc/portage/env/debug-cflags
# Добавить -ggdb в CFLAGS для отладки
CFLAGS="-O2 -ggdb -pipe"
FEATURES="${FEATURES} nostrip"

Затем «отметьте» пакет, указав в /etc/portage/package.env строку, которая применит к нему набор debug-cflags:

/etc/portage/package.env
media-video/mplayer debug-cflags

Возможность nostrip и другие ключи FEATURES описаны на странице Возможности Portage.

Локальное определение переменных

Пользовательские переменные

Не всегда нужно определять переменную глобально. Например, можно добавить каталог /home/my_user/bin и текущий рабочий каталог в переменную PATH только для себя — без влияния на PATH остальных пользователей системы. Для локального определения переменных служат ~/.bashrc (для всех интерактивных сеансов оболочки) или ~/.bash_profile (для сеансов входа):

~/.bashrc

# Двоеточие без последующего указания каталога означает текущий рабочий каталог
PATH="${PATH}:/home/my_user/bin:"

После выхода из системы и обратного входа переменная PATH будет обновлена.

Переменные сеанса

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

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

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

См. также