更新の代替案を使用したJAVA_HOMEとPATHの設定

更新の代替案を使用したJAVA_HOMEとPATHの設定

編集する

質問はbashスクリプトとJava環境についてです。忍耐を持って時間をかけて答えてくださった方々に感謝します。ありがとうございます。

Java環境ではsdkmanの使用を開始しました。実際、私はこの小さなスクリプトを始めたときに似たようなものを探していて、似たようなことをしようと考えていました。私の質問に対する答えを探しているすべての人にこのツールをお勧めします。独自のスクリプトがあるかどうかは問題ではありません。一度試してみることを強くお勧めします。

sdkmanは、言語バージョンのインストール、サイド要件(たとえば、maven、gradle、およびkotlin)、および環境変数を処理します。

https://sdkman.io/


元の質問

アクティブなJavaバージョンを考慮して、ユーザーのJAVA_HOMEとPATHを自動的に設定するbashスクリプトを作成していますが、何らかの理由で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

スクリプトソース

すでに代替フレームワークによって管理されているため、PATH変数を設定しなくてもJava環境を構成するのに十分です。

Fさん乾杯してください。

関連情報