web-dev-qa-db-fra.com

Comment modifier PATH dans un script Shell?

J'ai plusieurs projets qui me demandent de changer de version de Java/Grails/Maven. J'essaie de gérer cela avec des scripts qui apporteraient les modifications. Par exemple:

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

Lorsque cela s'exécute, il modifie avec succès le CHEMIN dans le contexte du script, mais le script se termine et aucune modification n'a été effectuée.

Comment puis-je exécuter un script de manière à modifier le CHEMIN dans le shell dans lequel je travaille actuellement?

J'utilise Cygwin.

31
Eric Wilson

Vous devez utiliser source ou eval ou pour générer un nouveau Shell.

Lorsque vous exécutez un script Shell, un nouveau enfant Shell est généré. Ce enfant Shell exécutera les commandes de script. L'environnement du père Shell restera inchangé par tout ce qui se passe dans le enfant Shell .

Il existe de nombreuses techniques différentes pour gérer cette situation:

  1. Préparez un fichier sourcefile contenant une liste de commandes à source dans le shell actuel:

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

    puis la source

    source sourcefile
    

    notez qu'il n'y a pas besoin d'un sha-bang au début du sourcefile, mais cela fonctionnera avec.

  2. Préparez un script evalfile.sh qui imprime la commande pour définir l'environnement:

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

    puis evaluer:

    eval `evalfile.sh`
    
  3. Configurez et exécutez un nouveau Shell:

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

    notez que lorsque vous tapez exit dans ce Shell, vous reviendrez au père .

  4. Mettez un alias dans votre ~/.bashrc:

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

    et appelez-le si nécessaire:

    prepare_environ
    
42
andcoz

Vous pouvez le faire en utilisant la fonction intégrée source:

. script_name

Certains shells fournissent un alias nommé source:

source script_name
19
Dimitre Radoulov