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 . lub source, 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ę . lub source. 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ówi sudo: 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ń z sudo. 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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *