Mam wiele kont Amazon EC2 i chcę szybko móc zmieniać zmienne, takie jak $EC2_HOME
, używając skrypt.
Mam skonfigurowany skrypt powłoki w następujący sposób:
#!/bin/sh export EC2_HOME=/home/me/.ec2 echo $EC2_HOME
Po uruchomieniu skryptu wiem, że EC2_HOME
jest ustawione, ale myślałem, że użycie export
spowoduje, że zmienna pozostanie po zakończeniu skryptu. Nie, ponieważ uruchomienie echo $EC_HOME
nic nie pokazuje.
Wiem, że to musi być bardzo podstawowa wiedza na temat skryptów Linuksa, ale nie wiem. próbowałem poszukać podobnych pytań bez powodzenia – więc przepraszam, jeśli to jest duplikat.
Odpowiedź
Powinieneś znaleźć źródło swojego skryptu, z
. ./script
lub
source ./script
Komentarze
- powodem jest to, że skrypt odradza nowy proces powłoki jako element podrzędny bieżącej powłoki. Żadne zmiany środowiska wprowadzone w procesie potomnym nie mogą wpłynąć na element nadrzędny. Gdy używasz
.
lubsource
, nie tworzysz nowego procesu potomnego, uruchamiasz polecenia w bieżącej powłoce. - @glennjackman Mam podobny problem i wypróbowałem Twoje rozwiązanie, ale wylogowuje mnie z powłoki, gdy wykonuję
.
lubsource
. Dlaczego tak się stało pening? - @Patryk: może Twój skrypt zawiera instrukcję
exit
, więc nie nadaje się do pozyskiwania. - Podczas gdy
source ./script
działa całkowicie dobrze,sudo source ./script.sh
mówisudo: source: command not found
. Jak mogę to zrobić za pomocą sudo? - @ 71GA: w zależności od preferencji kompilacji dla
sudo
oraz w zależności od ustawień konfiguracji w/etc/sudoers
możesz lub nie możesz zachować swojego środowiska podczas wykonywania poleceń zsudo
. Proponuję spróbować źródła skryptu, a następnie uruchomićsudo
z opcją-E
, aby chronić środowisko. Jeśli to nie zadziała, przypuszczam, że niewiele możesz zrobić.
Odpowiedź
Po uruchomieniu skrypt otrzymuje własną powłokę i własne środowisko, które znika, gdy tylko skrypt zostanie zakończony. Aby zachować zmienne środowiskowe, przenieś skrypt do swojej bieżącej powłoki:
$ source ./a.sh
lub równoważnie (ale trochę bardziej przenośnie) użyj POSIX dot command :
$ . ./a.sh
Następnie definicje zostaną umieszczone w bieżącym środowisku powłoki i zostaną odziedziczone przez programy, które z niego uruchamiasz.
Aby być bliżej uruchomienia skryptu, . a.sh
znajdzie plik a.sh, przeszukując katalogi w PATH
zmienna środowiskowa.
Istnieją pewne subtelności w sposobie ich zachowania i czy .
i source
są takie same (lub w ogóle obecne). . ./a.sh
z pewnością będą zachowywać się tak samo w każdej powłoce zgodnej z POSIX, ale source
i .
i . a.sh
i . ./a.sh
, mogą się różnić . Dla Bash source
i .
są takie same we wszystkich przypadkach; dla zsh source
zawsze najpierw sprawdza bieżący katalog ; ksh jest zasadniczo podobny.
Jeśli nazwa skryptu jest podana jako ścieżka (zawierająca /
), ta ścieżka jest używana bezpośrednio we wszystkich przypadkach. Najbardziej przenośną i niezawodną rzeczą do zrobienia jest . ./script
lub . /path/to/script
.
Odpowiedź
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)
Komentarze
- Wygląda niebezpiecznie, ale przydatne, jeśli ufasz temu skryptowi!
Odpowiedź
Spróbuj
exec ./script
Polecenie exec uruchamia skrypt w bieżącej powłoce bez uruchamiania powłoki nieinteraktywnej.