Jak mogę „wyeksportować” zmienne środowiskowe w skrypcie powłoki?

54

Mam wiele kont Amazon EC2 i chcę szybko móc zmieniać zmienne, na przykład za $EC2_HOMEpomocą skryptu.

Mam skonfigurowany skrypt powłoki w ten sposób:

#!/bin/sh
export EC2_HOME=/home/me/.ec2
echo $EC2_HOME

Kiedy uruchamiam skrypt, wiem, że EC2_HOMEjest ustawiony, ale pomyślałem, że użycie exportspowoduje, że zmienna pozostanie po zakończeniu skryptu. Nie działa, ponieważ bieganie echo $EC_HOMEniczego nie pokazuje.

Wiem, że to musi być bardzo podstawowa znajomość skryptów Linuksa, ale nie wiem. Próbowałem znaleźć powiązane pytania bez powodzenia - przepraszam, jeśli jest to duplikat.

cwd
źródło

Odpowiedzi:

60

Skrypt źródłowy powinieneś, korzystając z

. ./script

lub

source ./script
enzotib
źródło
19
powodem jest to, że twój skrypt odradza nowy proces powłoki jako element potomny bieżącej powłoki. Wszelkie zmiany środowiska wprowadzone w procesie potomnym nie mogą wpływać na element nadrzędny. Kiedy używasz .lub source, nie tworzysz nowego procesu potomnego, uruchamiasz polecenia w bieżącej powłoce.
glenn jackman
1
@glennjackman Mam podobny problem i próbowałem twojego rozwiązania, ale to mnie wylogowuje z powłoki, kiedy to robię .lub source. Dlaczego to się dzieje ?
Patryk
7
@Patryk: może twój skrypt ma exitinstrukcję, więc nie jest odpowiednie źródło.
enzotib
Chociaż source ./scriptdziała całkowicie dobrze, sudo source ./script.shmówi sudo: source: command not found. Jak mogę to zrobić za pomocą sudo?
71GA
1
@ 71GA: w zależności od preferencji kompilacji sudoi zależnie od ustawień konfiguracyjnych /etc/sudoersmożna lub nie można zachować środowiska podczas uruchamiania poleceń za pomocą sudo. Sugeruję, abyś spróbował pobrać swój skrypt, a następnie uruchomić sudoz -Eopcją ochrony środowiska. Jeśli to nie zadziała, myślę, że niewiele możesz zrobić.
enzotib
35

Po uruchomieniu skryptu otrzymuje on własną powłokę i własne środowisko, które znikają natychmiast po zakończeniu skryptu. Aby zachować zmienne środowiskowe, umieść skrypt w bieżącej powłoce:

$ source ./a.sh

lub równoważnie (ale nieco bardziej przenośnie) użyj polecenia kropkowego POSIX :

$ . ./a.sh

Następnie definicje zostaną umieszczone w bieżącym środowisku powłoki i odziedziczone przez wszelkie programy, które z niego uruchomisz.

Aby być bliżej uruchomienia skryptu, . a.shznajdzie a.sh, przeszukując katalogi w PATHzmiennej środowiskowej.


Istnieją pewne subtelności w tym, jak się zachowują i czy są .i sourcesą takie same (lub w ogóle obecne). . ./a.shna pewno zachowa się tak samo w każdej powłoce kompatybilnej z POSIX, ale sourcei ., i . a.shi i . ./a.shmogą się różnić. Dla Bash sourcei .są takie same we wszystkich przypadkach; dla zsh sourcezawsze najpierw sprawdza bieżący katalog ; ksh jest zasadniczo podobny.

Jeśli nazwa skryptu jest podana jako ścieżka (zawierająca a /), ścieżka ta jest używana bezpośrednio we wszystkich przypadkach. Najbardziej przenośną rzeczą do zrobienia jest . ./scriptlub . /path/to/script.

Michael Homer
źródło
1

Dla przypomnienia.

Jeśli chcesz uruchomić skrypt z Internetu, który eksportuje env do systemu

możesz użyć następującego formatu

source <(curl -s -L https://raw.githubusercontent.com/iamwwc/wwcdocker/master/install.sh)

Na przykład:

source <(curl -s -L https://example.com/install.sh)
toffi
źródło
Wygląda niebezpiecznie, ale przydatny, jeśli ufasz temu skryptowi!
Mark Stewart,