我编写了一个脚本来更改shell的java环境变量:
#!/bin/bash
#env variables can be changed only if we call the script with source setJavaVersion.sh
case $1 in
6)
export JAVA_HOME=/atgl/product/java/jdk-1.6.0_43/linux-redhat_x86_64/jdk1.6.0_43/
export PATH=$JAVA_HOME:$PATH ;
;;
7)
export JAVA_HOME=/atgl/product/java/jdk-1.7.0_51/linux-redhat_x86_64/jdk1.7.0_51
export PATH=$JAVA_HOME:$PATH ;
;;
8)
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.91-0.b14.el7_2.x86_64/jre/
export PATH=$JAVA_HOME:$PATH ;
;;
*)
error java version can only be 1.6, 1.7 or 1.8
;;
esac
要执行它,我输入:
source setJavaVersion.sh 6
用jdk6设置环境,为jdk7设置源setJavaVersion.sh 7。
当我用以下方式查看环境变量时:
$ echo $JAVA_HOME
和
$ echo $PATH
我看到变量已经很好地更新了。
然而,当我执行命令
时java -version
它没有更新。
如果我直接在shell中输入相同的导出命令,java -version
将返回更新的结果。
为什么?
修改 我用deathangel908答案更新了我的脚本。 以下是脚本执行前后java和PATH的输出:
$ which java
/atgl/product/java/jdk-1.7.0_51/linux-redhat_x86_64/jdk1.7.0_51/bin/java
$ echo $PATH
/CPD/SDNT/tools/bin:/CPD/SDNT/tools/x86_64-pc-unix11.0/bin:/atgl/product/java/jdk-1.7.0_51/linux-redhat_x86_64/jdk1.7.0_51/bin:/CPD/SDNT/tools/bin:/CPD/SDNT/tools/x86_64-pc-unix11.0/bin:/atgl/product/java/jdk-1.7.0_51/linux-redhat_x86_64/jdk1.7.0_51/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/users/t0059888/bin:/users/t0059888/bin
$ source setJavaVersion 6
$ which java
/atgl/product/java/jdk-1.7.0_51/linux-redhat_x86_64/jdk1.7.0_51/bin/java
$ echo $PATH
/CPD/SDNT/tools/bin:/CPD/SDNT/tools/x86_64-pc-unix11.0/bin:/atgl/product/java/jdk-1.7.0_51/linux-redhat_x86_64/jdk1.7.0_51/bin:/CPD/SDNT/tools/bin:/CPD/SDNT/tools/x86_64-pc-unix11.0/bin:/atgl/product/java/jdk-1.7.0_51/linux-redhat_x86_64/jdk1.7.0_51/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/users/t0059888/bin:/users/t0059888/bin:/atgl/product/java/jdk-1.6.0_43/linux-redhat_x86_64/jdk1.6.0_43/
答案 0 :(得分:2)
您每次都要添加路径,需要将其删除并重新添加 出口
: export a="$a:3"
$ echo $a # :3
: export a="$a:3"
: echo $a # :3:3
当你执行java时,bash在PATH
变量中开始查找,找到第一个匹配项并执行它。
您可以使用which java
检查已执行的java
命令的实际路径。
因此,要解决您的问题,请记住没有java的路径:
if [ -z ${PATH_SAVE+x} ]; then
export PATH_SAVE="$PATH"
fi
export PATH="$PATH_SAVE:$JAVA_HOME"
请记住引用变量,以防它们包含特殊符号或空格。
您也可以通过运行echo $PATH
答案 1 :(得分:1)
根据您在编辑中添加的输出,最后添加了新的PATH
。由于Java 7位于PATH
的开头,因此在运行which java
时会使用Java 7。
当您执行命令时,将使用PATH
上找到的第一个匹配项,因此,请尝试在变量的开头添加它(正如您在原始脚本中所做的那样,没有在另一个答案。我的意思是,其他答案建议的是一个好主意,你不应该一遍又一遍地添加相同的路径,但是如果你在PATH
变量的末尾添加Java路径,确保在以前的路径中找不到其他java。)
对于我在原始脚本中可以看到的内容,它应该可以正常工作。
尝试在原始脚本的开头添加set -x
,然后查看输出。如果您也可以共享该输出,将会很有帮助。
最后,确保Java 6中的二进制文件具有正确的文件权限(确保java是可执行的)。
答案 2 :(得分:0)
我的错误是路径中无法访问java可执行文件。它位于bin文件夹中。我以前做的错了:
export PATH="$JAVA_HOME:$PATH"
这是解决方案:
export PATH="$JAVA_HOME/bin:$PATH"