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"

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


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'

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.


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 }')

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.