PATH 中的动态变量替换

PATH 中的动态变量替换

我想在同一台机器(Linux Mint 17)上运行不同版本的 Java,默认运行 Java 7。所以我把它放入/etc/environment

JAVA_HOME="/tools/java/java7"
JAVA7_HOME="/tools/java/java7"
JAVA8_HOME="/tools/java/java8"

并且/etc/profile

export PATH="${JAVA_HOME}/bin:...:${PATH}"

如果等于,则期望值java -version为 8,如果设置为指向 Java 7,则期望值为 7。JAVA_HOME/tools/java/java8

因此,我运行:

┌[madhead@madhead-mint:~/Projects/thymeleaf]
└─$ export JAVA_HOME=/tools/java/java8 && java -version
java version "1.7.0_60"
Java(TM) SE Runtime Environment (build 1.7.0_60-b19)
Java HotSpot(TM) Server VM (build 24.60-b09, mixed mode)

┌[madhead@madhead-mint:~/Projects/thymeleaf]
└─! $ export JAVA_HOME=/tools/java/java7 && java -version
Java(TM) SE Runtime Environment (build 1.7.0_60-b19)
Java HotSpot(TM) Server VM (build 24.60-b09, mixed mode)

无论它JAVA_HOME $PATH看起来如何:

┌[madhead@madhead-mint:~/Projects/thymeleaf]
└─$ echo $PATH
/home/madhead/bin:/usr/local/bin:/tools/java/java7/bin:...:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

还有export JAVA_HOME=/tools/java/java8 && which java输出/tools/java/java7/bin/java

因此,看起来当我登录时会出现真正的替换。这种行为可以改变吗?如果我可以使用环境变量而不是符号链接来解决这个问题,那就太好了。

答案1

您说得对,定义 PATH 时会发生替换。解决这个问题很简单。定义一个bash/zsh函数:

javaswitch() { [[ "$1" =~ ^[0-9]$ ]] && export  PATH=${PATH/java[0-9]/java$1}; }

现在,无论何时您想要切换 Java 版本,请运行:

javaswitch 7

或者:

javaswitch 8

为了使定义javaswitch永久化,请将其放在您的~/.bashrc文件中。

怎么运行的

  • [[ "$1" =~ ^[0-9]$ ]]

    为了防止输入错误,此测试确保参数是数字。如果不是,则不进行任何更改。

    如果您确定只使用版本 7 或 8,那么请改用:

    [[ "$1" =~ ^[7-8]$ ]]
    
  • export PATH=${PATH/java[0-9]/java$1}

    这使用模式替换将 PATH 更新为新的版本号。

相关内容