Bash shell脚本:如何设置JAVA_HOME环境变量

3
使用 openSUSE,我下载了 jdk1.6.0_24 的 Oracle rpm 包,并希望将 java home 环境变量设置为 /usr/java/jdk1.6.0_24,但 /etc/alternatives 系统无法自动检测已安装的 JDK。update-alternatives 或其他方法都无法找到 jdk。
因此,我想在 BASH 脚本中手动检测 JAVA home。
如果我运行此命令:sudo find /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

为什么需要使用sudo才能使用find命令?如果您的用户ID无法读取,那么您不应该将该值用于JAVA_HOME。 - glenn jackman
你说得对。我把所有脚本中的sudo都去掉了。谢谢。 - djangofan
4个回答

4

something like

#!/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}

我没有进行过测试,但希望你能理解(我认为按照Glenn Jackman的答案使用select更加简洁/友好,我不知道这个存在,所以很高兴看到了这个问题!)


这已经足够让我理解了。谢谢! - djangofan
谢谢Matt。我已经将您编辑过的脚本以我的回答形式发布在下面了。 - djangofan

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"

你之前使用的 "choices" 方法真的很有趣。我想不到那个。 - djangofan
事后看来,我会写 choices=( /usr/java/*/ ),假设使用 bash。 - glenn jackman

2
不需要坐在Linux终端前,但是以下内容应该能帮助您开始:
...
jdkpath=`sudo find /usr -name 'jdk1.6*'`
export JAVA_HOME=$jdkpath
...

根据需要进行调整。


1
不要养成无端地在命令前加上 sudo 的习惯。将二进制文件设置为 root 可读,但当前用户不可读有什么好处呢?而且你不想至少加上 -type d | head -1 来防止多个匹配以及 zip 文件等的匹配吗? - Mike Samuel
@Mike 我在按照原帖的sudo脚本操作,我完全同意使用“-type d”,并且会将“head -1”更改为“-maxdepth 1”。然而,这不在原帖的脚本中,我也不是100%确定为什么没有加上去,所以我保留了它。 - AlG
抱歉,我没有在 OP 的脚本中看到 sudo - Mike Samuel

0

根据Matt的回答,这是我正在使用的脚本:

#!/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

我发表了这个答案已经有两年了。现在我倾向于使用像这样的方法:https://gist.github.com/djangofan/5526565/raw/b6425dba457bdbad63604b571efe85b1b3716dd4/java-setup.sh - djangofan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接