Jak od razu wyeksportować ustawione zmienne? Polecenie

set wyświetla wszystkie zmienne lokalne, jak poniżej. Jak wyeksportować wszystkie te zmienne naraz?

>set a=123 b="asd asd" c="hello world" 

Komentarze

  • co masz na myśli eksport wszystko na raz? możesz użyć średników, aby zdefiniować w jednej linii … jak a = 123; b = " asd asd "; c = " hello world "
  • Bardzo podobny do unix.stackexchange .com / q / 79064/4667
  • set wyświetla również funkcje i zmienne systemowe, takie jak BASH_VERSION
  • Twoje pytanie jest niejasne . Czy to fragment set wyników, które ' są ponownie wyświetlane? Jeśli tak, to ' nie jest bash ' s. Czy chcesz wyeksportować wszystkie aktualnie ustawione zmienne, w tym specjalne zmienne powłoki? Albo tylko te 3 zmienne, jak w export a b c?
  • export ${!T*} wyeksportują dowolny zdefiniowany parametr, którego nazwa zaczyna się od T. Niestety, nie wydaje się, aby ' był sposobem łatwego wygenerowania listy wszystkich zdefiniowanych parametrów.

Odpowiedź

Uruchom następujące polecenie przed ustawieniem zmiennych:

set -a 

man page:

-a
Gdy ta opcja jest włączona, atrybut eksportu należy ustawić dla każdego zmienna, do której wykonywane jest przypisanie;

Aby wyłączyć tę opcję, uruchom następnie set +a.

Przykład:

set -a . ./environment set +a 

Gdzie environment zawiera:

FOO=BAR BAS="quote when using spaces" 

Komentarze

  • Musi to być włączone przed przypisaniem do zmiennych. Nie ' nie robi nic z poprzednio przypisanymi zmiennymi.
  • @chepner, Dzięki zapomniałem o tym wspomnieć !!
  • To również automatycznie eksportuje funkcje w taki sam sposób, jak function example(){ echo good; }; export -f example

Odpowiedź

Działa to jeśli twoja powłoka to bash (prawdopodobnie również inne powłoki)

export > /my/env/var/file 

twój nowy plik będzie zawierał zrzut wszystkich aktualnie zdefiniowanych zmiennych … z wpisami na przykład

declare -x PORT="9000" declare -x PORT_ADMIN="3001" declare -x PORT_DOCKER_REGISTRY="5000" declare -x PORT_ENDUSER="3000" declare -x PRE_BUILD_DIR="/cryptdata6/var/log/tmp/khufu01/loud_deploy/curr/loud-build/hygge" declare -x PROJECT_ID="hygge" declare -x PROJECT_ID_BUSHIDO="bushido" 

, a następnie podnieść bieżącą powłokę z tymi wszystkimi problemami ze zmiennymi środowiska

source /my/env/var/file 

Odpowiedź

`echo "export" $((set -o posix ; set)|awk -F "=" "BEGIN{ORS=" "}1 $1~/[a-zA-Z_][a-zA-Z0-9_]*/ {print $1}")` 
  1. Najpierw pobierz wszystkie ustawione zmienne środowiskowe: (set -o posix ; set) Źródła: https://superuser.com/questions/420295/how-do-i-see-a-list-of-all-currently-defined-environment-variables-in-a-linux-ba

  2. Pobierz wszystkie nazwy zmiennych środowiskowych oddzielone spacją: awk -F "=" "BEGIN{ORS=" "}1 $1~/[a-zA-Z_][a-zA-Z0-9_]*/ {print $1}" Odniesienie: awk-Drukowanie wartości kolumny e bez nowej linii i dodania przecinka i https://stackoverflow.com/questions/14212993/regular-expression-to-match-a-pattern-inside-awk-command

  3. Teraz musimy wyeksportować te zmienne, ale xargs nie może tego zrobić, ponieważ rozwidla proces potomny, eksport musi być uruchomiony w ramach bieżącego procesu. echo "export" ... utwórz żądane polecenie, a następnie użyj „, aby je uruchomić. To wszystko: p.

Komentarze

  • Witaj w U & L SE. Może możesz edytować swój post i podać jakieś wyjaśnienia.
  • To ' nie jest poprawne, zakładając, że nazwy zmiennych środowiskowych będą składać się wyłącznie z az i AZ. Zwykle zawierają także podkreślenia i cyfry, więc wzorzec będzie wyglądał następująco: [a-zA-Z_][a-zA-Z0-9_]*. Istnieją pewne odmiany w zależności od powłoki, którą ' ponownie używasz, ale jest to bezpieczne / przenośne podejście.
  • Dobra uwaga @ChrisJohnson – zaktualizowano!

Odpowiedź

Możesz dodać export do nazwy zmiennej za pomocą awk i eval wynikowe wyjście:

eval $(printenv | awk -F= "{ print "export " $1 }") 

Komentarze

  • printenv wyświetla zmienne, które są już wyeksportowane. To również wygrywało ' t propozycję pracy oczywiście, jeśli istnieją zmienne, które zawierają znaki nowego wiersza.

Dodaj komentarz

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