Como alterar o PATH em um script de shell?

28

Tenho vários projetos que exigem que eu mude as versões do Java / Grails / Maven. Estou tentando lidar com isso com alguns scripts que fazem as alterações. Por exemplo:

#!/bin/sh

export JAVA_HOME=/cygdrive/c/dev/Java/jdk1.5.0_22
export PATH=$JAVA_HOME/bin:$PATH
export GRAILS_HOME=/cygdrive/c/dev/grails-1.0.3
export PATH=$GRAILS_HOME/bin:$PATH
export MAVEN_HOME=/cygdrive/c/dev/apache-maven-2.0.11
export PATH=$MAVEN_HOME/bin:$PATH
which java
which grails
which mvn

Quando isso é executado, ele altera com êxito o PATH no contexto do script, mas o script termina e nenhuma alteração foi realizada.

Como posso executar um script para alterar o PATH do shell no qual estou trabalhando atualmente?

Estou usando o Cygwin.

Eric Wilson
fonte

Respostas:

39

Você precisa usar sourceou evalou gerar uma nova concha.

Quando você executa um script de shell, um novo shell filho é gerado. Este shell filho executará os comandos de script. O ambiente do shell pai permanecerá intocado por qualquer coisa que ocorra no shell filho .

Existem várias técnicas diferentes para gerenciar essa situação:

  1. Prepare um arquivo sourcefile containg uma lista de comandos para sourceno shell atual:

    export JAVA_HOME=/cygdrive/c/dev/Java/jdk1.5.0_22
    export PATH=$JAVA_HOME/bin:$PATH

    e depois buscar

    source sourcefile

    note that there is no need for a sha-bang at the begin of the sourcefile, but it will work with it.

  2. Prepare um script evalfile.sh que imprima o comando para definir o ambiente:

    #!/bin/sh
    echo "export JAVA_HOME=/cygdrive/c/dev/Java/jdk1.5.0_22"
    echo "export PATH=$JAVA_HOME/bin:$PATH"

    e depois evalatualize:

    eval `evalfile.sh`
  3. Configure e execute um novo shell:

    #!/bin/sh
    export JAVA_HOME=/cygdrive/c/dev/Java/jdk1.5.0_22
    export PATH=$JAVA_HOME/bin:$PATH
    
    exec /bin/bash

    note que quando você digita exiteste shell, você retornará ao pai .

  4. Coloque um alias no seu ~/.bashrc:

    alias prepare_environ='export JAVA_HOME=/cygdrive/c/dev/Java/jdk1.5.0_22; export PATH=$JAVA_HOME/bin:$PATH;'

    e chame quando necessário:

    prepare_environ
andcoz
fonte
1
Notei que sourcefunciona apenas para bash. Saída para ksh: /bin/ksh: source: not foundpara sh: sh: 0: source: not found. A resposta abaixo deve ser considerada para essas conchas.
Danny Lo
@ Dannylo, você está certo, mas a questão é claramente bashcentralizada.
andcoz
A 'exportação' é necessária com $ PATH - o que presumivelmente já existe?
esskov 27/12/19
@esskov geralmente não é. Lembro-me apenas de uma versão antiga do sh no AIX que exigia (por volta de 1992), mas provavelmente era algum tipo de bug.
andcoz
19

Você pode fazer isso usando a fonte incorporada:

. script_name

Alguns shells fornecem um alias chamado source :

source script_name
Dimitre Radoulov
fonte
-1

instalado o Chocolatey @ unix, você pode simplesmente executar o RefreshEnv para obter variáveis ​​de ambiente atualizadas na sua sessão atual

detalhe

小 色狼
fonte
1
A pergunta que você vinculou também (e suas respostas) é sobre o Windows.   Esta pergunta é sobre Unix e Linux, portanto, sua postagem não responde a essa pergunta.
G-Man diz 'Reinstate Monica'
instalado Chocolatey @ unix
色狼 色狼
OK, você afirma que esta resposta funciona para o Unix. Seu link de detalhes ainda é irrelevante. Por favor, forneça detalhes de como isso funciona no Unix. Os links para documentos oficiais seriam bons, mas não publique apenas links; coloque as informações relevantes em sua resposta. … Por favor, não responda nos comentários; edite sua resposta para torná-la mais clara e completa.
G-Man diz 'Restabelecer Monica