Допустимо ли иметь указатели в / etc / environment с использованием синтаксиса $ FOO? Сейчас моя / etc / environment выглядит следующим образом:
JAVA_HOME=/usr/lib/jvm/java-6-openjdk
MAVEN_HOME=/usr/bin/apache-maven/apache-maven-3.0.4
M2_HOME=$MAVEN_HOME
M2=$MAVEN_HOME/bin
PATH=/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:$JAVA_HOME/bin:$MAVEN_HOME/bin
Я не получаю ожидаемых результатов:
~$ echo $JAVA_HOME
/usr/lib/jvm/java-6-openjdk
~$ echo $MAVEN_HOME
/usr/bin/apache-maven/apache-maven-3.0.4
~$ echo $PATH
/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin/bin:/usr/games:$JAVA_HOME/bin:$MAVEN_HOME/bin
Я не нашел много документации по /etc/environment
, но причина, по которой все работает не так, как вы ожидаете, заключается в том, что это «не файл сценария», и, следовательно, не обрабатывается оболочкой, поэтому ссылка на ранее -определенная переменная не работает. Это объясняет поведение, которое вы видите.
Вам лучше определить такие переменные среды в вашем доме, в .profile
или .bashrc
, или, если они вам нужны для всех пользователей, в /etc/profile.d
или /etc/bash.bashrc
.
Здесь есть довольно обширная документация по настройке переменных среды здесь , и она указывает на .profile
или .bashrc
в качестве предпочтительного места для размещения этого материала.
Документация Ubuntu делает это невозможным. НО, есть ответ.
ОТВЕТ : Создание постоянных общесистемных переменных среды в /etc/bash.bashrc
JAVA_HOME="/tools/java"
...
PATH="$JAVA_HOME:$PATH"
Подробности:
Я опубликовал более длинный ответ на этот вопрос AskUbuntu
Вы можете использовать указатели в /etc/environment
, но должны использовать другой синтаксис:
try:
JAVA_HOME=/usr/lib/jvm/java-6-openjdk
MAVEN_HOME=/usr/bin/apache-maven/apache-maven-3.0.4
M2_HOME=${MAVEN_HOME}
M2=${MAVEN_HOME}/bin
PATH="/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:${JAVA_HOME}/bin:${MAVEN_HOME}/bin"
Используйте фигурные скобки {}
вокруг имен переменных при обращении к другое назначение переменной. Поэтому вместо $JAVA_HOME
используйте ${JAVA_HOME}
. Также кажется необходимым заключить в кавычки значение переменной, в которой у вас есть указатель на другие переменные:
так PATH="... ${SOME_VAR} ..."
Канонический источник для получения информации Вы ищете (по крайней мере, для ароматов Debian то использование SystemD; и производные этого, такие как современные версии Ubuntu), man 5 environment.d
(некоторое форматирование в этой выборке было изменено по моему усмотрению для ясности):
Формат конфигурации
Конфигурационные файлы содержат список
KEY=VALUE
присвоения переменной среды, разделенные новыми строками. Правая сторона этих присвоений может сослаться на ранее определенные переменные среды, с помощью${OTHER_KEY}
и$OTHER_KEY
формат. Также возможно использовать${FOO:-DEFAULT_VALUE}
расшириться таким же образом как${FOO}
если расширение не было бы пусто, в этом случае оно расширяется доDEFAULT_VALUE
, и используйте${FOO:+ALTERNATE_VALUE}
расшириться доALTERNATE_VALUE
пока${FOO}
расширился бы до непустого значения. Никакие другие элементы синтаксиса оболочки не поддерживаются.Каждый
KEY
должно быть допустимое имя переменной. Пустые строки и строки, начинающиеся с символа комментария#
проигнорированы.Пример
Пример 1. Среда установки для предоставления доступа к программе, установленной в
/opt/foo
/etc/environment.d/60-foo.conf
:–FOO_DEBUG=force-software-gl,log-verbose PATH=/opt/foo/bin:$PATH LD_LIBRARY_PATH=/opt/foo/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH} XDG_DATA_DIRS=/opt/foo/share:${XDG_DATA_DIRS:-/usr/local/share/:/usr/share/}