Jak wyeksportować zmienne z pliku?

78

Mam tmp.txtplik zawierający zmienne do wyeksportowania, na przykład:

a=123
b="hello world"
c="one more variable"

Jak mogę wyeksportować wszystkie te zmienne za pomocą exportpolecenia, aby mogły być później wykorzystane przez procesy potomne?

Neerav
źródło
1
bash --init-file somefile.blah -c „polecenie”
Dillian Murphey
SO ma przydatną odpowiedź na temat automatycznego źródła .envplików po przejściu cddo katalogu.
Dan Dascalescu,
@Neerav Proszę przyjąć inną odpowiedź. To jest znacznie lepsze rozwiązanie.
coderDude

Odpowiedzi:

64
source tmp.txt
export a b c
./child ...

Sądząc po drugim pytaniu, nie chcesz na stałe kodować nazw zmiennych:

source tmp.txt
export $(cut -d= -f1 tmp.txt)

Sprawdź to:

$ source tmp.txt
$ echo "$a $b $c"
123 hello world one more variable
$ perl -E 'say "@ENV{qw(a b c)}"'

$ export $(cut -d= -f1 tmp.txt)
$ perl -E 'say "@ENV{qw(a b c)}"'
123 hello world one more variable
Glenn Jackman
źródło
2
To nie zadziała, jeśli plik środowiska zawiera na przykład komentarze. (np. pliki, które mogą być ponownie użyte przez systemd's EnvironmentFile)
Chris Lamb
3
@ChrisLamb możesz użyć, grepaby pominąć komentarze:export $(grep --regexp ^[A-Z] tmp.txt | cut -d= -f1)
gvee
181
set -a
. ./tmp.txt
set +a

set -apowoduje, że zmienne¹ zdefiniowane odtąd są automatycznie eksportowane. Jest dostępny w dowolnej powłoce podobnej do Bourne'a. .jest standardową nazwą Bourne dla tego sourcepolecenia, więc preferuję ją ze względu na przenośność ( sourcepochodzi z cshi jest teraz dostępna w większości nowoczesnych powłok podobnych do Bourne'a, w tym bashchociaż (czasami z nieco innym zachowaniem).

W powłokach POSIX można także użyć set -o allexportbardziej opisowego alternatywnego sposobu napisania ( set +o allexportrozbrojenia).


¹ W bash, uważaj, że powoduje to również eksport wszystkich funkcji zadeklarowanych, gdy allexportjest włączone, do środowiska (ponieważ BASH_FUNC_myfunction%%zmienne środowiskowe, które są następnie importowane przez wszystkie bashpowłoki działają w tym środowisku, nawet gdy działają jako sh).

Stéphane Chazelas
źródło
1

Po prostu zrób:

while read LINE; do export "$LINE"; done < ./tmp.txt
Benjamin Berhault
źródło
Czy sprawdziłeś, czy to działa?
RalfFriedl
@RalfFriedl to powinno działać, dlaczego nie? Nie jest to zbyt eleganckie, a pozyskiwanie set -abyłoby o wiele prostsze, ale tak naprawdę działa.
terdon
To jest kruche. Nie pozwala na komentarze w pliku wejściowym, nie obsługuje poprawnie wartości zmiennych cytowanych i zawodzi w przypadku zmiennych wieloliniowych. To prawda, że ​​nie mam wielu zmiennych wieloliniowych, ale regularnie używam komentarzy i często muszę używać cudzysłowów dla wartości zmiennych.
Louis
To zadziałało dla mnie.
mchawre