【问题标题】:Bash shell script: How to set JAVA_HOME environment variableBash shell 脚本:如何设置 JAVA_HOME 环境变量
【发布时间】:2011-07-23 04:10:50
【问题描述】:

使用 openSUSE,我下载了 jdk1.6.0_24 的 Oracle rpm,我想将 java home 环境变量设置为 /usr/java/jdk1.6.0_24 但 /etc/alternatives 系统无法自动检测到这个安装JDK。 Update-alternatives ,或者其他找不到 jdk 的东西。

所以,我想在 BASH 脚本中手动检测 JAVA 主页。

如果我运行这个命令: 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。
  • 你的权利。从我所有的脚本中取出 sudo。谢谢。

标签: java bash environment-variables


【解决方案1】:

不是坐在 linux 终端上,但这应该能让你继续前进:

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

根据需要进行调整。

【讨论】:

  • 不要养成无缘无故在前面加上sudo 的习惯?让 root 可读但当前用户不可读的二进制文件对您有什么好处?你不希望-type d | head -1 至少在那里防止多个匹配,以及 zip 文件的匹配等吗?
  • @Mike 我在 sudo 上遵循 OPs 脚本,我完全同意 -type d 并将 head -1 更改为 -maxdepth 1。但是,它不在 OPs 脚本中,我也不能 100% 确定它为什么不存在,所以我保留了它。
  • 对不起。我在 OP 的脚本中没有看到 sudo。
【解决方案2】:

类似

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

我还没有测试过,但希望你能明白要点(我会说使用 select as per glenn jackman's answer更简洁/友好,不知道存在所以我很高兴我读了这个 Q! )

【讨论】:

  • 这对我来说已经足够了。谢谢!
  • 谢谢马特。我以我自己的答案的形式在下面发布了您编辑的脚本。
【解决方案3】:
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"

【讨论】:

  • 您上面使用的“选择”方法真的很有趣。没想到。
  • 事后看来,假设 bash,我会写 choices=( /usr/java/*/ )。
【解决方案4】:

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-05
  • 2013-09-04
  • 1970-01-01
  • 2016-10-07
  • 2013-02-06
  • 1970-01-01
  • 2016-12-23
相关资源
最近更新 更多