Вообще-то shell-скрипт не может менять переменные окружения. Точнее может, но только
для себя и порожденных им процессов. В данном же случае хочется поменять переменные
окружения родительского bash процесса, который вызвал наш скрипт. Это невозможно.
Выход в том, что наш "скрипт" должен выполняться в том же bash процессе, что его
"вызывает". Делается это так: "source /home/gelin/bin/javahome
. /home/gelin/bin/javahome
Этот скрипт изменяет переменные окружения JAVA_HOME
и PATH
для переключения между различными Java Development Kit (JDK). JDK расположены
в различных каталогах файловой системы. "Разрешенные" к использованию JDK перечислены
в отдельном файле. Проверяется наличие выбираемого JDK в списке, наличие соответсвующего
каталога, в переменной PATH
соответствующий путь заменяется на новый.
Файл /home/gelin/bin/javahome
:
# This is not ordinary shell script!!! # Because it tryes to change environment variables, it must be run in current shell, not in subshell. # Use ". javahome" or define alias for this. # # (c) 2005-2006 Denis Nelubin aka Gelin # # This script replaces current values of JAVA_HOME and PATH environment variable # for switch between different Java SDK implementations. # This script uses list of JDK for check previous PATH state. JDK_LIST="/home/gelin/etc/jdk.list" JDK=$1 if [ -$JDK- == -- ] then # print usage echo Usage: . javahome \<JDK name\> echo JDKs listed in $JDK_LIST are: while read JDK_PATH do echo `basename $JDK_PATH` done < $JDK_LIST else # define search flags HAVE_IN_LIST=false HAVE_PATH=false # for each listed jdk while read JDK_PATH do # find path by base name (last part of path) if [ -`basename $JDK_PATH`- == -$JDK- ] then HAVE_IN_LIST=true NEW_PATH=$JDK_PATH fi # find currently selected (in PATH) JDK if [ ${PATH/$JDK_PATH/} != $PATH ] #when removing, PATH changed then HAVE_PATH=true OLD_PATH=$JDK_PATH fi # warning if list is incorrect if [ ! -d $JDK_PATH ] then echo Warning: $JDK_PATH is not exist fi done < $JDK_LIST # specified JDK is not listed if [ -$HAVE_IN_LIST- != -true- ] then echo $JDK is not listed in $JDK_LIST Can\'t change environment. fi # JDK is not listed in PATH if [ -$HAVE_PATH- != -true- ] then echo $NEW_PATH/bin is not in current PATH if [ -$HAVE_IN_LIST- == -true- ] then echo Inserting $NEW_PATH/bin to PATH ... PATH=$NEW_PATH/bin:"${PATH}" JAVA_HOME=$NEW_PATH fi fi # found in PATH and in list if [ -$HAVE_IN_LIST- == -true- -a -$HAVE_PATH- == -true- ] then JAVA_HOME=$NEW_PATH PATH=${PATH/$OLD_PATH/$NEW_PATH} fi # update environment export JAVA_HOME export PATH # print result echo JAVA_HOME=$JAVA_HOME echo PATH=$PATH fi
Список JDK. Файл /home/gelin/etc/jdk.list
:
/usr/lib/jvm/java-gcj /opt/jdk5
Чтобы не писать каждый раз точку и полный путь к скрипту, определим алиас. Тогда "скрипт" действительно будет работать почти как настоящий скрипт:
gelin@asus:~$ tail -1 /home/gelin/.bashrc alias javahome='. /home/gelin/bin/javahome'