Um script pode modificar uma variável de ambiente de seu shell de chamada? [duplicado]

1

Estou configurando meu JAVA_HOME no meu arquivo ~ / .bashrc .

Agora, preciso criar um script que altere o JAVA_HOME apenas para o terminal atual, para que eu possa iniciar um aplicativo que precise do java 5.

Eu criei esse script para fazer essa tarefa, mas depois de terminar, posso ver que JAVA_HOME não está atualizado

export JAVA_HOME=/usr/lib/jvm/java-5-oracle/
export PATH=$PATH:$JAVA_HOME    

Aqui está o resultado

$ ./javaHome5.sh
$ echo $JAVA_HOME
/usr/lib/jvm/java-6-oracle/

Acho que a razão pela qual isso não está sendo aplicado é que um script está sendo executado em seu próprio terminal, portanto, quando o script terminar, o terminal atual não será afetado.

Atualmente, a única maneira que encontrei em torno disso é:

1) Edite meu ~ / .bashrc e mude o JAVA_HOME var

2) Execute $ source ~/.bashrc para aplicar as alterações no terminal atual. Que novamente não pode ser aplicado em um script, pois o comando source precisa ser executado na janela atual.

Escusado será dizer que esta alteração aplica-se a todas as novas janelas de terminais, pelo que praticamente preciso de o fazer duas vezes: Uma antes de iniciar a minha aplicação e mais uma vez logo após isto, apenas para restaurar as vars do ambiente. Isso não é muito conveniente.

Você tem alguma idéia de como eu posso mudar esse var usando um script?

    
por yannicuLar 09.06.2016 / 11:13

1 resposta

4

Não é possível. Como você observou corretamente, seu script está executando em seu próprio shell. Esse shell obtém uma cópia do ambiente do shell pai quando é bifurcado e não tem como acessar o ambiente do shell pai. E isso é bom, porque senão os scripts poderiam ter todos os tipos de efeitos colaterais imprevisíveis. ;)

Para alterar variáveis em seu shell atual, você sempre pode fornecer seu arquivo de script (em vez de executá-lo como um processo independente), de modo que o script seja executado pelo seu shell atual em vez de por um bifurcado. Se o seu script for chamado myscript.sh , chame-o como source myscript.sh em vez de ./myscript.sh .

    
por Malte Skoruppa 09.06.2016 / 11:27