"Указатели" с синтаксисом $ в /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