"Указатели" с синтаксисом $ в /etc/environment

Допустимо ли иметь указатели в /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

3 ответа

Решение

Я не нашел много документации по /etc/environment, но причина, по которой все работает не так, как вы ожидаете, заключается в том, что это "не файл сценария" и, следовательно, не обрабатывается оболочкой, поэтому обращение к ранее определенной переменной не работает. Это объясняет поведение, которое вы видите.

Вам лучше определять такие переменные среды в вашем доме, в .profile или же .bashrc или, если они вам нужны для всех пользователей, в /etc/profile.d или же /etc/bash.bashrc,

Здесь есть довольно обширная документация по настройке переменных среды, и она указывает на .profile или же .bashrc как предпочтительное место, чтобы положить этот материал.

Каноническим источником информации, которую вы ищете (по крайней мере, для разновидностей 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/}

Вы можете использовать указатели в /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"

Используйте фигурные скобки {} вокруг имен переменных при обращении к другому назначению переменной. Итак, вместо $JAVA_HOMEиспользовать ${JAVA_HOME}, Также представляется необходимым иметь кавычки вокруг значения переменной, в которой у вас есть указатель на другие переменные:

так PATH="... ${SOME_VAR} ..."

Документация Ubuntu делает это невозможным. НО, есть ответ.

ОТВЕТ. Создайте постоянные общесистемные переменные среды в /etc/bash.bashrc

JAVA_HOME="/tools/java"
...
PATH="$JAVA_HOME:$PATH"  

Подробности:
Я написал более длинный ответ на этот вопрос AskUbuntu

Другие вопросы по тегам