2011-03-25 471 views
3

使用openSUSE的,我下载了jdk1.6.0_24甲骨文的RPM,我想设置Java家居环境变量/usr/java/jdk1.6.0_24但在/ etc/alternatives系统无法自动检测到这个安装的JDK。更新替代品,或者其他什么都找不到jdk。的Bash shell脚本:如何设置JAVA_HOME环境变量

所以,我想手动检测JAVA家在bash脚本。

如果我运行这个命令:sudo的发现在/ usr -name 'JDK1.6 *',我得到这样的结果:

/usr/java/jdk1.6.0_24 

如何导致到一个环境变量管?我想这样做

#!/bin/bash 
read in JAVA_HOME var from a file 
if file doesnt exist 
    sudo find /usr -name 'jdk1.6*' 
    prompt user for which jdk is correct 
    set that choice to a variable 
    add the JDK to alternatives if it is missing 
    save variable to a file and dont prompt next time 
    set the alternatives java choice 
fi 
echo $JAVA_HOME 
+0

为什么你需要sudo使用find?如果您的用户标识无法读取它,则不应将该值用于JAVA_HOME。 – 2011-03-25 19:59:11

+0

你的权利。把我的所有剧本都拿出来了。谢谢。 – djangofan 2011-03-25 20:29:46

回答

4

#!/bin/bash 
function validate_java_home { 
    if [ -z ${JAVA_HOME} ] 
    then 
     # do something if the file doesn't provide ${JAVA_HOME} 
    else 
     if [ ! -e ${JAVA_HOME} ] 
     then 
      # do something if the file provides a non existent ${JAVA_HOME} 
     fi 
    fi 
} 

if [ ! -e ${YOUR_FILE_NAME_CONTAINING_JAVA_HOME} ] 
then 
    JAVA_HOME_CANDIDATES=$(find /usr -name 'jdk1.6*') 
    echo "Found the following candidates for JAVA_HOME, reply with the one you want then press return" 
    echo "" 
    echo $JAVA_HOME_CANDIDATES 
    read USER_SUBMITTED_JAVA_HOME 
    echo "You chose $USER_SUBMITTED_JAVA_HOME" 
    JAVA_HOME=${USER_SUBMITTED_JAVA_HOME} 
else 
    . ${YOUR_FILE_NAME_CONTAINING_JAVA_HOME} 
fi 
validate_java_home 
export ${JAVA_HOME} 

我没有测试过这一点,但希望你得到的要点(和我说按格伦·杰克曼的回答更加简洁/友好使用选择,不知道存在所以我很高兴我看到这个Q)

+0

这对我来说绰绰有余。谢谢! – djangofan 2011-03-25 20:29:12

+0

谢谢马特。我以自己的答案的形式在下面发布了您编辑的脚本。 – djangofan 2011-03-25 21:14:44

2

不是停留在一个Linux终端,但是这应该让你去:

... 
jdkpath=`sudo find /usr -name 'jdk1.6*'` 
export JAVA_HOME=$jdkpath 
... 

根据需要调整。

+0

感谢您的想法。我刚刚编辑了我的问题多一点。 – djangofan 2011-03-25 19:47:21

+1

不要在套结'sudo'对事物的正面没有很好的理由的习惯得到什么?有根可读的二进制文件有什么好处,但当前用户无法读取吗?并且你不想要'-type d |头至少在那里,以防止多个匹配,并匹配的zip文件等? – 2011-03-25 20:11:12

+0

@Mike我下面就以须藤OP的脚本,我对'型D'完全一致,并会在'头-1'更改为'-maxdepth 1'。然而,这不在OPs脚本中,我不能100%确定它为什么不在那里,所以我保留了它。 – AlG 2011-03-28 12:04:20

4
oldIFS="$IFS" 
IFS=$'\n' 
choices=($(find /usr/java -type d -maxdepth 1 -print)) 
select choice in "${choices[@]}"; do 
    [[ "$choice" ]] && break 
done 
IFS="$oldIFS" 
export JAVA_HOME="$choice" 
+0

上面使用的“选择”方法非常有趣。没有想到这一点。 – djangofan 2011-03-28 20:29:41

+0

事后,我会写'选择=(在/ usr/JAVA/* /)'假设是bash。 – 2013-11-13 18:16:28

0

基于马特的答案,这里是我使用的脚本:

#!/bin/bash 
# JAVA_HOME script for RPM based java installations 
# http://www.oracle.com/technetwork/java/javase/install-linux-64-rpm-138254.html 
# examine and understand /etc/alternatives before you run this 

cd $SITE_HOME 

function set_java_home { 
    if [ -z $JAVA_HOME ]; then 
     echo "Using default value for JAVA_HOME: /usr/java/default" 
     JAVA_HOME=/usr/java/default 
    fi 
    export -p JAVA_HOME 
    echo $JAVA_HOME > java.home.config 
    echo "JAVA_HOME variable set to $JAVA_HOME ." 
} 

if [ -f java.home.config ]; then 
    JAVA_HOME=$(<java.home.config) 
else 
    JAVA_HOME_CANDIDATES=$(find /usr -type d -name 'jdk1.6*') 
    echo "Found the following candidates for JAVA_HOME. Pick one: " 
    echo "---" 
    echo $JAVA_HOME_CANDIDATES 
    echo "---" 
    read USER_SUBMITTED_JAVA_HOME 
    echo "You chose $USER_SUBMITTED_JAVA_HOME ." 
    JAVA_HOME=${USER_SUBMITTED_JAVA_HOME} 
fi 
# Set the variable 
set_java_home 
+0

我发布了这个答案已经2年了。现在我inclided使用这样的方法:https://gist.github.com/djangofan/5526565/raw/b6425dba457bdbad63604b571efe85b1b3716dd4/java-setup.sh – djangofan 2013-06-13 21:06:33