Como alterar o PATH dentro de um script de shell?

26

Eu 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 fariam 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 dentro do contexto do script, mas o script termina e nenhuma alteração foi realizada.

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

Estou usando o Cygwin.

    
por Eric Wilson 27.10.2011 / 22:28

3 respostas

36

Você precisa usar source ou eval ou gerar um novo shell.

Quando você executa um shell script, um novo shell child é gerado. Este shell child executará os comandos de script. O ambiente shell father permanecerá intocado por qualquer coisa que aconteça no shell child .

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

  1. Prepare um arquivo sourcefile contendo uma lista de comandos para source no shell atual:

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

    e, em seguida, fonte-lo

    source sourcefile
    

    observe que não há necessidade de um sha-bang no início do arquivo_de_origem , mas funcionará com ele.

  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, em seguida, eval uate:

    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
    

    observe que quando você digita exit neste shell, você retornará para o 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 ligue quando necessário:

    prepare_environ
    
por 27.10.2011 / 23:16
19

Você pode fazer isso usando a fonte integrada:

. script_name

Alguns shells fornecem um apelido chamado source :

source script_name
    
por 27.10.2011 / 22:45
-1

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

detail

    
por 07.09.2018 / 08:06