编辑
问题更多的是关于 bash 脚本和 java 环境,感谢那些有耐心并抽出时间回复我的人。我非常感激。
至于Java环境我开始使用sdkman。当我开始这个小脚本时,我实际上正在寻找类似的东西,我正在考虑做类似的事情。无论谁正在寻找我的问题的答案,我都建议使用该工具。如果你有自己的剧本并不重要,我强烈建议你尝试一下。
sdkman 将关心语言版本安装、侧面需求(如 maven、gradle 和 kotlin)以及环境变量。
原始问题
我正在构建一个 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。