Comment modifier PATH dans un script shell?


28

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 à changer le CHEMIN pour le shell dans lequel je travaille actuellement?

J'utilise Cygwin.

Réponses:


39

Vous devez utiliser sourceou evalou pour générer un nouveau shell.

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

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

  1. Préparer un fichier sourcefile containg une liste de commandes à sourcela shell en cours:

    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'est pas nécessaire de faire un sha-bang au début du fichier source , 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"

    et ensuite le faire evalpasser:

    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 exitdans ce shell, vous revenez 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

1
J'ai remarqué que cela sourcene fonctionne que pour bash. Sortie pour ksh: /bin/ksh: source: not foundpour sh: sh: 0: source: not found. La réponse ci-dessous doit être considérée pour ces obus.
Danny Lo

@dannylo, vous avez raison mais la question est clairement bashcentrée.
andcoz

L'exportation est-elle requise avec $ PATH - qui existe probablement déjà?
esskov

@esskov ce n'est généralement pas le cas. Je ne me souviens que d'une ancienne ancienne version de sh sur AIX qui l'exigeait (vers 1992) mais, probablement, c'était une sorte de bogue.
andcoz

19

Vous pouvez le faire en utilisant le code source intégré:

. script_name

Certains shells fournissent un alias nommé source :

source script_name

-1

installé Chocolatey @ unix, vous pouvez simplement exécuter RefreshEnv pour obtenir des variables d'environnement mises à jour dans votre session actuelle

détail


1
La question que vous avez également liée (et ses réponses) concerne Windows.   Cette question concerne Unix et Linux, donc votre message ne répond pas à cette question.
G-Man dit `` Réinstalle Monica '' le

installé Chocolatey @ unix
小 色狼

OK, vous prétendez que cette réponse fonctionne pour Unix. Votre lien de détail n'est toujours pas pertinent. Veuillez fournir des détails sur la façon dont cela fonctionne sous Unix. Des liens vers des documents faisant autorité seraient utiles, mais ne publiez pas uniquement des liens; mettez les informations pertinentes dans votre réponse. … Veuillez ne pas répondre dans les commentaires; modifiez votre réponse pour la rendre plus claire et plus complète.
G-Man dit `` Réinstalle Monica '' le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.