編集する
質問はbashスクリプトとJava環境についてです。忍耐を持って時間をかけて答えてくださった方々に感謝します。ありがとうございます。
Java環境ではsdkmanの使用を開始しました。実際、私はこの小さなスクリプトを始めたときに似たようなものを探していて、似たようなことをしようと考えていました。私の質問に対する答えを探しているすべての人にこのツールをお勧めします。独自のスクリプトがあるかどうかは問題ではありません。一度試してみることを強くお勧めします。
sdkmanは、言語バージョンのインストール、サイド要件(たとえば、maven、gradle、およびkotlin)、および環境変数を処理します。
元の質問
アクティブな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さん乾杯してください。