Jak eksportować ustawione zmienne jednocześnie?

39

setpolecenie wyświetla wszystkie lokalne zmienne jak poniżej. Jak eksportować te zmienne jednocześnie?

>set
a=123
b="asd asd"
c="hello world"
Neerav
źródło
co masz na myśli eksport na raz? możesz użyć średników, aby zdefiniować w jednym wierszu ... jak a = 123; b = „asd asd”; c = „witaj świecie”
Raza
Bardzo podobny do unix.stackexchange.com/q/79064/4667
glenn jackman
2
setwyświetla także funkcje i zmienne systemowe, takie jak BASH_VERSION
glenn jackman,
Twoje pytanie jest niejasne. Czy to jest fragment setwyników, które wyświetlasz? Jeśli tak, to nie bashjest. Czy chcesz wyeksportować wszystkie aktualnie ustawione zmienne, w tym specjalne zmienne powłoki? Czy tylko te 3 zmienne jak w export a b c?
Stéphane Chazelas,
export ${!T*}wyeksportuje dowolny zdefiniowany parametr, którego nazwa zaczyna się od T. Niestety wydaje się, że nie ma sposobu na łatwe wygenerowanie listy wszystkich zdefiniowanych parametrów.
chepner

Odpowiedzi:

72

Przed ustawieniem zmiennych uruchom następujące polecenie:

set -a 

strona podręcznika:

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

Aby wyłączyć tę opcję, uruchom set +apóźniej.

Przykład:

set -a
. ./environment
set +a

Gdzie environmentzawiera:

FOO=BAR
BAS='quote when using spaces'
nitin
źródło
13
Należy to jednak włączyć przed przypisaniem do zmiennych. Nie robi nic z wcześniej przypisanymi zmiennymi.
chepner
1
@chepner, Dzięki, zapomniałem o tym wspomnieć !!
nitin
To również automatycznie eksportuje funkcje w taki sam sposób, jakfunction example(){ echo good; }; export -f example
Oliver I
5
`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) Odwołanie: https://superuser.com/questions/420295/how-do-i-see-a-list-of-all-currently-defined-environment-variables-in-a- linux-ba

  2. Uzyskaj wszystkie nazwy zmiennych środowiskowych, oddzielone spacją: awk -F "=" 'BEGIN{ORS=" "}1 $1~/[a-zA-Z_][a-zA-Z0-9_]*/ {print $1}' Odwołanie: awk-Drukowanie wartości kolumny bez nowego wiersza i dodanie przecinka oraz 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ż forksuje proces potomny, eksport musi być uruchomiony w ramach bieżącego procesu. echo "export" ...zbuduj polecenie, które chcemy, a następnie użyj ``, aby je uruchomić. To wszystko: p.

Bear Huang
źródło
Witamy w U&L SE. Może możesz edytować swój post i wyjaśnić.
Archemar
1
Zakładanie, że nazwy zmiennych środowiskowych będą składać się wyłącznie z az i AZ, jest niepoprawne. Zazwyczaj zawierają również podkreślenia i cyfry, więc wzór byłby taki [a-zA-Z_][a-zA-Z0-9_]*. Istnieją pewne odmiany tego w zależności od używanej powłoki, ale jest to bezpieczne / przenośne podejście.
Chris Johnson
Dobry punkt @ChrisJohnson - zaktualizowano!
Wil Moore III
3

Możesz exportprzejść do nazwy zmiennej poprzez awki evalwynikowy wynik:

eval $(printenv | awk -F= '{ print "export " $1 }')
Wil Moore III
źródło
2
printenvwypisuje zmienne, które są już wyeksportowane. To również nie będzie działać poprawnie, jeśli istnieją zmienne zawierające znaki nowego wiersza.
Stéphane Chazelas,
2

Działa to, jeśli twoja powłoka jest bash (możliwe, że również inne powłoki)

export > /my/env/var/file

twój nowy plik będzie zawierał zrzut wszystkich aktualnie zdefiniowanych zmiennych ... z wpisami takimi jak

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"

następnie, aby podnieść bieżącą powłokę ze wszystkimi tymi zagadnieniami env vars

source  /my/env/var/file
Scott Stensland
źródło