題 PATH中的動態變量替換


我想在同一台機器上運行不同版本的Java(Linux Mint 17),默認為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_HOME 等於 /tools/java/java8 如果設置為指向Java 7,則為7。

所以,我跑:

┌[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 太。

因此,當我登錄時,看起來真正的替換。可以改變這種行為嗎?如果我可以使用env變量來解決這個問題,而不是使用符號鏈接,這將是很好的。


2
2017-11-17 21:52


起源




答案:


你是正確的,定義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更新為新版本號。


4
2017-11-17 23:02



酷,很好的解決方案!謝謝! - madhead