Wie ändere ich PATH in einem Shell-Skript?

28

Ich habe mehrere Projekte, bei denen ich die Versionen von Java / Grails / Maven ändern muss. Ich versuche, dies mit einigen Skripten zu behandeln, die die Änderungen vornehmen würden. Beispielsweise:

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

Wenn dies ausgeführt wird, wird der Pfad im Kontext des Skripts erfolgreich geändert, das Skript wird jedoch beendet, und es wurden keine Änderungen vorgenommen.

Wie kann ich ein Skript ausführen, um den Pfad für die Shell zu ändern, in der ich gerade arbeite?

Ich benutze Cygwin.

Eric Wilson
quelle

Antworten:

39

Sie müssen sourceoder evaloder verwenden, um eine neue Shell zu erzeugen.

Wenn Sie ein Shell-Skript ausführen, wird eine neue untergeordnete Shell erstellt. Diese untergeordnete Shell führt die Skriptbefehle aus. Die Umgebung der Vater- Shell bleibt von allen Vorgängen in der untergeordneten Shell unberührt .

Es gibt viele verschiedene Techniken, um mit dieser Situation umzugehen:

  1. Bereiten Sie eine Datei- Quelldatei mit einer Liste von Befehlen sourcein der aktuellen Shell vor:

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

    und dann quelle es

    source sourcefile

    Beachten Sie, dass zu Beginn der Quelldatei kein Sha-Bang erforderlich ist, dies funktioniert jedoch.

  2. Bereiten Sie ein Skript evalfile.sh vor , das den Befehl zum Festlegen der Umgebung ausgibt :

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

    und dann evalUate es:

    eval `evalfile.sh`
  3. Konfigurieren Sie eine neue Shell und führen Sie sie aus:

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

    Beachten Sie, dass Sie beim Eingeben exitdieser Shell zum Vater zurückkehren .

  4. Fügen Sie einen Alias ​​in Ihr ~/.bashrc:

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

    und nennen es bei Bedarf:

    prepare_environ
andcoz
quelle
1
Mir ist aufgefallen, dass sourcedas nur für funktioniert bash. Ausgang für ksh: /bin/ksh: source: not foundfür sh: sh: 0: source: not found. Die Antwort unten sollte für diese Muscheln berücksichtigt werden.
Danny Lo
@dannylo, du hast recht, aber die Frage ist eindeutig bashzentriert.
Andcoz
Wird bei $ PATH 'export' benötigt - was vermutlich schon existiert?
Esskov
@esskov ist es normalerweise nicht. Ich erinnere mich nur an eine alte Version von sh unter AIX, für die es erforderlich war (circa 1992), aber wahrscheinlich war es eine Art Fehler.
Andcoz
19

Sie könnten das tun, indem Sie die eingebaute Quelle verwenden:

. script_name

Einige Shells bieten einen Alias ​​namens source :

source script_name
Dimitre Radoulov
quelle
-1

Wenn Sie Chocolatey @ unix installiert haben, können Sie RefreshEnv ausführen, um aktualisierte Umgebungsvariablen in Ihre aktuelle Sitzung zu übernehmen

Detail

小 小
quelle
1
Die Frage, die Sie ebenfalls verlinkt haben (und deren Antworten), bezieht sich auf Windows.   Diese Frage bezieht sich auf Unix und Linux, daher beantwortet Ihr Beitrag diese Frage nicht.
G-Man sagt, dass Monica
installierte Chocolatey @ unix
小 小 8.
OK, Sie behaupten, dass diese Antwort für Unix funktioniert. Ihr Detaillink ist immer noch irrelevant. Bitte geben Sie Einzelheiten dazu an, wie dies unter Unix funktioniert. Links zu maßgeblichen Dokumenten wären gut, aber posten Sie nicht nur Links. Tragen Sie die relevanten Informationen in Ihre Antwort ein. Bitte antworten Sie nicht in Kommentaren; Bearbeiten Sie Ihre Antwort, um sie klarer und vollständiger zu gestalten.
G-Man sagt, dass Monica