使用 update-alternatives 设置 JAVA_HOME 和 PATH

使用 update-alternatives 设置 JAVA_HOME 和 PATH

编辑

问题更多的是关于 bash 脚本和 java 环境,感谢那些有耐心并抽出时间回复我的人。我非常感激。

至于Java环境我开始使用sdkman。当我开始这个小脚本时,我实际上正在寻找类似的东西,我正在考虑做类似的事情。无论谁正在寻找我的问题的答案,我都建议使用该工具。如果你有自己的剧本并不重要,我强烈建议你尝试一下。

sdkman 将关心语言版本安装、侧面需求(如 maven、gradle 和 kotlin)以及环境变量。

https://sdkman.io/


原始问题

我正在构建一个 bash 脚本来自动考虑活动 java 的版本来设置用户的 JAVA_HOME 和 PATH,但是由于某种原因 PATH 没有正确构建,它添加了空格而不是“:”,任何人都可以告诉我为什么?

下面是脚本。

谢谢!

#!/bin/bash

export JAVA_HOME=$(dirname $(dirname `readlink -f /etc/alternatives/java`))

IFS=':';
for i in $PATH;
do
        JAVA1=$i/bin/java
        JAVA2=$i/java
        if [ -d "$i" ];
        then
                if [ ! -L "$JAVA1" ] && [ -x "$JAVA1" ] || [ ! -L "$JAVA2" ] && [ -x "$JAVA2" ];
                then
                        echo "dropping path: $i";
                else
                        NEW=$NEW:$i
                fi
        fi
done
PATH=$NEW:$JAVA_HOME/bin
echo 
echo "Final:"
echo $PATH

示例输出:

$ ./java_home_setter.sh 
dropping path: /usr/lib/jvm/java-8-openjdk-amd64/jre/bin

Final:
 /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games /usr/local/games /snap/bin /usr/lib/jvm/java-8-openjdk-amd64/bin

答案1

那是因为您已将 IFS 变量更改为使用 ':'

因此,当其输出时,您的变量将被替换为默认输出字段分隔符,即“空格”,认为“:”是输入字段分隔符。

你已经采取备份在使用 IFS 之前,如下所示:

OIFS=$IFS
IFS=':';

‘for’循环完成,恢复它:

IFS=$OIFS

还要删除前面没有路径开头的“:”

PATH=${PATH#:*}    

你的脚本应该是这样的:

#!/bin/bash

export JAVA_HOME=$(dirname $(dirname `readlink -f /etc/alternatives/java`))

OIFS=$IFS
IFS=':';
for i in $PATH;
do
        JAVA1=$i/bin/java
        JAVA2=$i/java
        if [ -d "$i" ];
        then
                if [ ! -L "$JAVA1" ] && [ -x "$JAVA1" ] || [ ! -L "$JAVA2" ] && [ -x "$JAVA2" ];
                then
                        echo "dropping path: $i";
                else
                        NEW=$NEW:$i
                fi
        fi
done
IFS=$OIFS
PATH=$NEW:$JAVA_HOME/bin
PATH=${PATH#:*}
echo 
echo "Final:"
echo $PATH

答案2

为什么不设置当前的 java 版本:

sudo update-alternatives --config java
sudo update-alternatives --config javac

(以及您需要的任何其他 java 二进制文件)

.bashrc然后在您的或中设置以下内容.zshrc

#!/bin/bash
if [ -z "${JAVA_HOME}" ]
then
    JAVA_HOME=$(readlink -nf $(which java) | xargs dirname | xargs dirname)
    if [ ! -e "$JAVA_HOME" ]
    then
        JAVA_HOME=""
    fi
    export JAVA_HOME=$JAVA_HOME
fi

脚本源

这足以配置一个 java 环境,无需设置 PATH 变量,因为它已经由替代框架管理。

干杯F。

相关内容