web-dev-qa-db-ja.com

update-alternativesでJava_HOMEとPATHを設定する

私はアクティブな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
2
RicardoPHP

これは、IFS変数を変更して「:」を使用したためです。

したがって、その出力時に、変数は、「:」が入力フィールドセパレーターであると見なして、「スペース」であるデフォルトの出力フィールドセパレーターに置き換えられます。

以下のようにIFSを使用する前にbackupを取得する必要があります。

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