¿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.

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

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

-1

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

detalle


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.