Переменные среды
Обновлено 4 июля 2019
Переменные среды
Что это такое?
Переменная среды — это именованный объект, который содержит информацию, используемую одним или несколькими приложениями. Многие пользователи (особенно новички в Linux) находят этот подход несколько странным или неуправляемым. Но это впечатление ошибочно: используя переменные среды, можно очень легко изменить настройку разнообразных программ.
Важные примеры
В следующей таблице описывается ряд переменных, используемых в системе Linux. Примеры их значений приведены далее.
Переменная | Описание |
---|---|
PATH | В этой переменной содержится список каталогов, разделенных двоеточиями, в которых система ищет исполняемые файлы. Если вы вводите имя исполняемого файла например ls , rc-update или emerge ), который не находится ни в одной из перечисленных здесь каталогов, этот файл не запустится (если, конечно, вы не указали полный путь, например /bin/ls ). |
ROOTPATH | У этой переменной такое же значение, что и у PATH, но в ней перечисляются только те каталоги, которые нужно просматривать при вводе команды пользователем с правами root. |
LDPATH | В этой переменной содержится список каталогов, разделенных двоеточиями, в которых динамический компоновщик ищет библиотеки. |
MANPATH | В этой переменной содержится список каталогов, разделенных двоеточиями, в которых команда man ищет страницы справки. |
INFODIR | В этой переменной содержится список каталогов, разделенных двоеточиями, в которых команда info ищет info-страницы. |
PAGER | В этой переменной содержится путь к программе, позволяющей постранично просматривать содержимое файлов, например less или more . |
EDITOR | В этой переменной содержится путь к программе, используемой для изменения файлов, например vi или nano . |
KDEDIRS | В этой переменной содержится список каталогов, разделенных двоеточиями, в которых находятся ресурсы KDE. |
CLASSPATH | В этой переменной содержится список каталогов, разделенных двоеточиями, в которых находятся классы Java. |
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" CLASSPATH="/opt/blackdown-jre-1.4.1/lib/rt.jar:." 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"
Глобальное определение переменных
Каталог /etc/env.d
Для того, чтобы определить эти переменные централизованно, в Calculate существует каталог /etc/env.d. В нём находится ряд файлов, например, "00basic", "05gcc" и так далее, в которых определяются переменные, необходимые программам, указанным в названии файлов.
Например, при установке gcc ebuild создает файл /etc/env.d/05gcc, содержащий следующие определения переменных:
PATH="/usr/i686-pc-linux-gnu/gcc-bin/3.2" ROOTPATH="/usr/i686-pc-linux-gnu/gcc-bin/3.2" MANPATH="/usr/share/gcc-data/i686-pc-linux-gnu/3.2/man" INFOPATH="/usr/share/gcc-data/i686-pc-linux-gnu/3.2/info" CC="gcc" CXX="g++" LDPATH="/usr/lib/gcc-lib/i686-pc-linux-gnu/3.2.3"
В других дистрибутивах вам предлагается изменять или добавлять определения переменных среды в /etc/profile или где-нибудь еще. Calculate, с другой стороны, облегчает вам поддержку и управление переменными среды, избавляя от необходимости уделять внимание многочисленным файлам, содержащим определения переменных.
Например, когда обновляется gcc, также без малейшего участия пользователя обновляется и /etc/env.d/05gcc.
От этого выигрывает не только Portage, но и вы, пользователь. Иногда от вас может потребоваться глобальная установка какой-нибудь переменной. Возьмем, к примеру, переменную http_proxy. Вместо того, чтобы возиться с /etc/profile, теперь можно просто создать файл 99local и добавить нужные определения туда:
/etc/env.d/99local
http_proxy="proxy.server.com:8080"
Используя один и тот же файл для всех своих переменных, вы можете быстро увидеть все определенные вами переменные вместе.
Сценарий env-update
Переменная PATH определяется в нескольких файлах в /etc/env.d. Нет, нет это не ошибка: при запуске env-update
различные определения объединяются перед обновлением переменных среды, позволяя пакетам (или пользователям) добавлять собственные значения переменных, не влияя на уже существующие.
Сценарий env-update
объединяет значения переменных из файлов, находящихся в /etc/env.d, в алфавитном порядке. Имена файлов должны начинаться с двух десятичных цифр. Порядок обновления, используемый env-update
:
00basic 99kde-env 99local +-------------+----------------+-------------+ PATH="/bin:/usr/bin:/usr/kde/3.2/bin:/usr/local/bin"
Объединение выполняется не всегда, а только для следующих переменных: KDEDIRS, PATH, CLASSPATH, LDPATH, MANPATH, INFODIR, INFOPATH, ROOTPATH, CONFIG_PROTECT, CONFIG_PROTECT_MASK, PRELINK_PATH и PRELINK_PATH_MASK. Для всех остальных переменных используется значение, определенное в последнем из файлов (по алфавиту в каталоге /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 restart
. Если нет, вам придется выйти и снова войти в систему, чтобы X порождала потомков, использующих новые значения переменных.
Локальное определение переменных
Пользовательские переменные
Далеко не всегда нужно определять переменные глобально. Например, вам может понадобиться добавить /home/my_user/bin и текущий рабочий каталог (где вы находитесь) к переменной PATH, но при этом не нужно, чтобы это добавление появилось и в переменной PATH у всех остальных пользователей. Если вы хотите определить переменную среды локально, используйте ~/.bashrc или ~/.bash_profile. Пример расширения PATH в для локальных нужд:
~/.bashrc
#(двоеточие без последующего указания каталога означает текущий рабочий каталог) PATH="${PATH}:/home/my_user/bin:"
Обновление вашей переменной PATH произойдет, когда вы выйдете и снова войдете в систему.
Сеансовые переменные
Иногда нужны еще более жесткие ограничения. Вам может потребоваться возможность запуска исполняемых файлов из специально созданного временного каталога без указания полного пути к ним, и без изменения файла ~/.bashrc ради нескольких минут.
В этом случае можно просто определить переменную PATH для текущего сеанса командой export
. Переменной будет присвоено временное значение до тех пор, пока вы не завершите сеанс. Пример определения сеансовой переменной среды:
export PATH="${PATH}:/home/my_user/tmp/usr/bin"