¿Cómo alterar la RUTA dentro de un script de shell?

28

Tengo varios proyectos que requieren que cambie las versiones de Java / Grails / Maven. Estoy tratando de manejar esto con algunos scripts que harían los cambios. Por ejemplo:

#!/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

Cuando esto se ejecuta, cambia con éxito la RUTA dentro del contexto del script, pero luego el script finaliza y no se ha realizado ningún cambio.

¿Cómo puedo ejecutar un script para cambiar la RUTA del shell en el que estoy trabajando actualmente?

Estoy usando Cygwin.

Eric Wilson
fuente

Respuestas:

39

Tienes que usar sourceo evalgenerar un nuevo caparazón.

Cuando ejecuta un script de shell, se genera un nuevo shell hijo . Este shell hijo ejecutará los comandos del script. El entorno del shell padre permanecerá intacto por cualquier cosa que ocurra en el shell secundario .

Existen muchas técnicas diferentes para manejar esta situación:

  1. Prepare un archivo fuente que contenga una lista de comandos sourceen el shell actual:

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

    y luego la fuente

    source sourcefile

    tenga en cuenta que no hay necesidad de un sha-bang al comienzo del archivo fuente , pero funcionará con él.

  2. Prepare un script evalfile.sh que imprima el comando para configurar el entorno:

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

    y luego evalevaluarlo:

    eval `evalfile.sh`
  3. Configure y ejecute un nuevo shell:

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

    tenga en cuenta que cuando escriba exiteste shell, volverá al padre .

  4. Pon un alias en tu ~/.bashrc:

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

    y llámalo cuando sea necesario:

    prepare_environ
andcoz
fuente
1
Me di cuenta de que sourcesolo funciona para bash. Salida para ksh: /bin/ksh: source: not foundpor sh: sh: 0: source: not found. La respuesta a continuación debe considerarse para estos depósitos.
Danny Lo
@dannylo, tienes razón, pero la pregunta es claramente bashcéntrica.
andcoz
¿Se requiere 'exportar' con $ PATH, que presumiblemente ya existe?
esskov
@esskov generalmente no lo es. Recuerdo solo una antigua versión antigua de sh en AIX que lo requería (alrededor de 1992) pero, probablemente, era algún tipo de error.
andcoz
19

Puede hacerlo utilizando la fuente incorporada:

. script_name

Algunos shells proporcionan un alias llamado fuente :

source script_name
Dimitre Radoulov
fuente
-1

instalado Chocolatey @ unix, solo puede ejecutar RefreshEnv para obtener variables de entorno actualizadas en su sesión actual

detalle

小 色狼
fuente
1
La pregunta que también vinculó (y sus respuestas) son sobre Windows.   Esta pregunta es sobre Unix y Linux, por lo que su publicación no responde a esta pregunta.
G-Man dice 'reinstalar a Monica' el
instalado Chocolatey @ unix
小 色狼
OK, afirmas que esta respuesta funciona para Unix. Su enlace de detalles sigue siendo irrelevante. Proporcione detalles sobre cómo funciona esto en Unix. Los enlaces a documentos autorizados serían buenos, pero no publique solo enlaces; Ponga la información relevante en su respuesta. ... Por favor no responda en los comentarios; edite su respuesta para que sea más clara y completa.
G-Man dice 'reinstalar a Monica' el