Jak zmienić PATH w skrypcie powłoki?


28

Mam kilka projektów, które wymagają ode mnie zmiany wersji Java / Grails / Maven. Próbuję sobie z tym poradzić za pomocą skryptów, które wprowadziłyby zmiany. Na przykład:

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

Wykonanie tej operacji powoduje pomyślną zmianę ŚCIEŻKI w kontekście skryptu, ale potem skrypt się kończy i nie dokonano żadnych zmian.

Jak uruchomić skrypt w celu zmiany PATH dla powłoki, w której obecnie pracuję?

Używam Cygwin.

Odpowiedzi:


39

Musisz użyć sourcelub evallub, aby spawnować nową powłokę.

Po uruchomieniu skrypt nowe dziecko powłoka jest piedestał. Ta powłoka podrzędna wykona polecenia skryptu. Środowisko powłoki ojca pozostanie nietknięte przez nic, co dzieje się w skorupie dziecka .

Istnieje wiele różnych technik zarządzania tą sytuacją:

  1. Przygotuj plik źródłowy pliku zawierający listę poleceń do sourcebieżącej powłoki:

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

    a następnie zrób to

    source sourcefile

    zwróć uwagę, że nie ma potrzeby sha-bang na początku pliku źródłowego , ale będzie z nim współpracował.

  2. Przygotuj skrypt evalfile.sh, który wypisuje polecenie, aby ustawić środowisko:

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

    a następnie wykorzystaj evalto:

    eval `evalfile.sh`
  3. Skonfiguruj i uruchom nową powłokę:

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

    zwróć uwagę, że po wpisaniu exittej powłoki powrócisz do ojca .

  4. Umieść alias w swoim ~/.bashrc:

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

    i w razie potrzeby zadzwoń:

    prepare_environ

1
Zauważyłem, że sourcedziała tylko w przypadku bash. Wyjście dla ksh: /bin/ksh: source: not founddla sh: sh: 0: source: not found. Poniższą odpowiedź należy rozważyć dla tych powłok.
Danny Lo

@ Dannylo, masz rację, ale pytanie jest wyraźnie bashcentryczne.
andcoz

Czy w przypadku $ PATH wymagany jest „eksport” - który prawdopodobnie już istnieje?
esskov

@esskov zwykle tak nie jest. Pamiętam tylko starą starą wersję sh w systemie AIX, która tego wymagała (około 1992 r.), Ale prawdopodobnie był to jakiś błąd.
andcoz

19

Możesz to zrobić za pomocą wbudowanego źródła :

. script_name

Niektóre powłoki udostępniają alias o nazwie source :

source script_name

-1

zainstalowany Chocolatey @ unix, możesz po prostu uruchomić RefreshEnv, aby uzyskać zaktualizowane zmienne środowiskowe do bieżącej sesji

Szczegół


1
Pytanie, które również podałeś (i odpowiedzi) dotyczy systemu Windows.   To pytanie dotyczy Uniksa i Linuksa, więc twój post nie odpowiada na to pytanie.
G-Man mówi „Reinstate Monica”

zainstalowany Chocolatey @ unix
小 色狼

OK, twierdzisz, że ta odpowiedź działa na Uniksie. Twój link do szczegółów jest nadal nieistotny. Podaj szczegóły, jak to działa w Uniksie. Linki do autorytatywnych dokumentów byłyby dobre, ale nie zamieszczaj tylko linków; wstaw odpowiednie informacje do swojej odpowiedzi. … Proszę nie odpowiadać w komentarzach; edytuj swoją odpowiedź, aby była jaśniejsza i bardziej kompletna.
G-Man mówi „Reinstate Monica”
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.