Substituição dinâmica de variável no PATH

2

Eu quero rodar diferentes versões do Java na mesma máquina (Linux Mint 17) com o padrão para o Java 7. Então, coloco isso em /etc/environment :

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

E em /etc/profile :

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

Espero que java -version seja 8 se JAVA_HOME for igual a /tools/java/java8 e 7 se estiver definido para apontar para o Java 7.

Então, eu corro:

┌[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)

e

┌[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)

Não importa o que seja JAVA_HOME $PATH se parece com isso:

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

E export JAVA_HOME=/tools/java/java8 && which java outputs /tools/java/java7/bin/java também.

Então, parece que a substituição real aparece quando eu faço o login. Esse comportamento pode ser alterado? Seria ótimo se eu pudesse resolver isso com variáveis env, e não com links simbólicos.

    
por madhead 17.11.2014 / 22:52

1 resposta

4

Você está certo de que a substituição ocorre quando o PATH está definido. É simples contornar isso. Defina uma função bash / zsh :

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

Agora, sempre que você quiser mudar as versões do java, execute:

javaswitch 7

Ou:

javaswitch 8

Para tornar a definição de javaswitch permanent, coloque-a no arquivo ~/.bashrc .

Como funciona

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

    Para proteção contra erros de digitação, isso testa para garantir que o argumento seja um número. Se não for, então nenhuma alteração será feita.

    Se tiver certeza de que usará somente as versões 7 ou 8, use em vez disso:

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

    Isso usa a substituição de padrões para atualizar o PATH para o novo número de versão.

por 18.11.2014 / 00:02