Сделать $ JAVA_HOME легко изменяемым в Ubuntu [закрыто]

139

В Ubuntu я бы хотел переключать мою переменную среды JAVA_HOME туда и обратно между Java 5 и 6.

Я открываю терминал и набираю следующее, чтобы установить переменную среды JAVA_HOME:

export JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun

И в том же окне терминала я набираю следующее, чтобы проверить, обновлена ​​ли переменная среды:

echo $JAVA_HOME

И я вижу /usr/lib/jvm/java-1.5.0-sun, что я и ожидал увидеть. Кроме того, я изменяю ~ / .profile и устанавливаю для переменной среды JAVA_HOME значение /usr/lib/jvm/java-1.5.0-sun.

А теперь о проблеме: когда я открываю новое окно терминала и проверяю свою переменную среды JAVA_HOME, набрав echo $ JAVA_HOME, я вижу, что моя переменная среды JAVA_HOME была возвращена к Java 6. Когда я перезагружаю свой компьютер (или регистрирую и обратно, я полагаю) переменная среды JAVA_HOME установлена ​​на Java 5 (предположительно из-за модификации, которую я внес в свой ~ / .profile).

Есть ли способ обойти эту проблему, так что я могу изменить свою JAVA_HOME среду без необходимости выйти из системы и обратно (и сделать это изменение переменного окружения палки во всех новых терминальных окнах)?

Чунхо Парк
источник
29
Какой правильный сайт и повторяющийся ответ?
Мартин Коничек 03
~/.profileФайл считывается только при входе в Ubuntu, так что если вы выход из системы / Логин затем JAVA_HOME устанавливаются для всех терминалов и любых других приложений , которые вы запускаете. Если вы установите JAVA_HOME, ~/.bashrcон будет виден только приложениям, запускаемым с терминала.
jr0cket

Ответы:

196

Поместите переменные среды в глобальный /etc/environmentфайл:

...
export JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun
...

Выполните «source / etc / environment» в каждой оболочке, в которой вы хотите обновить переменные:

$ source /etc/environment

Убедитесь, что это работает:

$ echo $JAVA_HOME
$ /usr/lib/jvm/java-1.5.0-sun

Отлично, выход из системы не требуется.

Если вы хотите установить переменную среды JAVA_HOME только в терминале, установите ее в файле ~ / .bashrc .

Мартин Коничек
источник
9
По-прежнему требуется перезапуск, чтобы эти изменения повлияли на приложения, запускаемые через пользовательский интерфейс Ubuntu (т. Е. Двойной щелчок по приложению)
Эрик Ху,
7
Чем это отличается от простой установки переменной в каждой чертовой оболочке?
mlissner
1
еще один способ не запускать это вручную каждый раз - это изменить ваш .bashrc файл, включив в него команду «source / etc / environment»
Нитьян 08
1
@MartinKonicek ваш пример неверен. в этой строке не должно быть слова «экспорт». / etc / environment содержит пары ключ-значение
pdeva
1
имейте в виду, что /etc/environmentэто особенное и не допускает подстановки переменных, например JRE_HOME=${JAVA_HOME}/jre, не будет работать.
Абдулл
31

Вероятно, это решит вашу проблему: https://help.ubuntu.com/community/EnvironmentVariables

Переменные среды для всего сеанса

Чтобы установить переменные среды таким образом, чтобы они влияли на среду конкретного пользователя, не следует размещать команды для установки их значений в определенных файлах сценария оболочки в домашнем каталоге пользователя, а следует использовать:

~ / .pam_environment - этот файл специально предназначен для настройки среды пользователя. Это не файл сценария, а скорее состоит из выражений присваивания, по одному в каждой строке.

Не рекомендуется:

~ / .profile - это, вероятно, лучший файл для размещения назначений переменных среды, поскольку он автоматически выполняется DisplayManager во время сеанса рабочего стола процесса запуска, а также оболочкой входа в систему при входе в систему из текстовой консоли.

Хольгер Фролофф
источник
Из предоставленной вами ссылки: «Приведенные ниже не рекомендуются, но предыдущее решение (?), Представленное на этой странице, не работало с версией 10.04 для настольных ПК. .Pam_environment, естественно, не распространяется на распространение.»
Calmarius,
14
~ / .pam_environment - отличный способ заблокировать ваш логин, если вы предполагаете, что он обрабатывает переменные. Я попытался установить PATH на $ {PATH}: $ {HOME} / bin, но не смог оценить переменные. Чистый результат: невозможно войти в систему :( Исправлено при посещении Ctrl-Alt-1 и запуске «/ bin / rm ~ / .pam_environment». Будьте исключительно осторожны или используйте дополнительную учетную запись для проверки настроек здесь.
Ален О'Ди,
6
Лично я не знаю, почему они потрудились создать файл среды, а затем заставить его работать совершенно иначе, чем любой другой механизм установки переменных среды, когда-либо работавший раньше. Простые пары ключ-значение, такие как файл среды, - это обычная BS. Есть причина, по которой мы используем переменные и ссылки в среде, и это все еще имеет смысл. Это упрощает администрирование. Кто бы ни были придурки, решившие, что способ работы с этим файлом с помощью PAM был лучшим, в лучшем случае являются идиоты. Переменные НЕОБХОДИМО интерпретировать.
Bill Rosmus
1
@ AlainO'Dea: У меня была точно такая же проблема. Был шокирован и обеспокоен, когда не смог пройти мимо экрана входа в систему. После некоторого покопания я обнаружил, что вы можете использовать переменные, но должны использовать другой синтаксис. например. PATH DEFAULT = $ {PATH}: $ {HOME} / bin Когда переменная не используется, простое присваивание, похоже, работает.
tim_wonil
Да, я согласен с @ AlainO'Dea. Если в вашем скрипте есть ошибка, вы не сможете войти в систему. Береги себя.
Эван Ху
13

Попробуйте эти шаги.

- Мы собираемся редактировать "etc \ profile". Переменные среды следует вводить в нижней части файла. Поскольку Ubuntu не дает доступа к корневой папке, нам придется использовать несколько команд в терминале.

Шаг 1: Запустите Терминал. Введите команду:gksudo gedit /etc/profile

Шаг 2: Откроется текстовый файл профиля. Введите переменные среды внизу страницы ........... Например: export JAVA_HOME=/home/alex/jdk1.6.0_22/bin/java

export PATH=/home/alex/jdk1.6.0_22/bin:$PATH

Шаг 3: сохраните и закройте файл. Проверьте, установлены ли переменные среды с помощью команды echo ........ Например echo $PATH

Alex
источник
9

Вам нужно поместить определение переменной в ~/.bashrcфайл.

Со страницы руководства bash:

Когда запускается интерактивная оболочка, не являющаяся оболочкой входа в систему, bash читает и выполняет команды из /etc/bash.bashrc и ~ / .bashrc, если эти файлы существуют.

Павел Надольски
источник
5

Традиционно, если вы хотите изменить переменную только в окнах терминала, установите ее в .bashrcфайле, который создается каждый раз, когда открывается новый терминал. .profileфайл не загружается каждый раз, когда вы открываете новый терминал.

Обратите внимание на разницу между .profile и .bashrc: в чем разница между .bashrc, .bash_profile и .environment?

.bashrcдолжен решить вашу проблему. Однако это неправильное решение, поскольку вы используете Ubuntu. См. Соответствующую страницу справки Ubuntu « Переменные среды для всего сеанса ». Таким образом, неудивительно, что .profileэто не работает для вас. Я использую Ubuntu 12.04 и xfce. Я настроил свой, .profileи он просто не вступает в силу, даже если я выхожу из системы и вхожу в систему. Подобный опыт здесь . Так что вам, возможно, придется использовать .pam_environmentфайл и полностью забыть о .profile, и .bashrc. И ПРИМЕЧАНИЕ, .pam_environmentэто не файл сценария.

ХунбоЧжу
источник
1

Обратите внимание bash(1), вам нужна оболочка входа в систему ~/.profile, чтобы -lвыбрать , то есть опцию.

Николай Фетисов
источник
1

Я знаю, что это длинный холодный вопрос, но он возникает каждый раз, когда выходит новый или недавний крупный выпуск Java. Теперь это легко применимо к замене местами 6 и 7.

Раньше я делал это с помощью update-java-alternatives: http://manpages.ubuntu.com/manpages/hardy/man8/update-java-alternatives.8.html

Ален О'Ди
источник
1

После внесения изменений в .profile вам необходимо запустить файл, чтобы изменения вступили в силу.

root@masternode# . ~/.profile

Как только это будет сделано, команда echo будет работать.

CodeShane
источник
Вы должны использовать, ~/.profileа не ./.profile.
Alexis Wilke