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?


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

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).


1

Po prostu zrób:

while read LINE; do export "$LINE"; done < ./tmp.txt

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
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.