Czy istnieje narzędzie do odczytu zmiennych środowiskowych z pliku env, a następnie uruchom polecenie (bardziej lekkie niż majster)?

16

foreman potrafi odczytać pliki .env i ustawić zmienne środowiskowe z zawartości, a następnie uruchomić program

na przykład foreman run -e vars.env myprogram

... ale robi wiele innych rzeczy (i przede wszystkim zajmuje się uruchamianiem rzeczy w formacie Procfile).

Czy istnieje prostsze narzędzie (Linux / Unix), które koncentruje się tylko na czytaniu plików .env i wykonywaniu poleceń w nowym środowisku?

Przykładowy plik środowiska (z http://ddollar.github.io/foreman/#ENVIRONMENT ):

FOO=bar
BAZ=qux
wodow
źródło
1
Czy możesz opublikować przykładowy plik .env? Podejrzewam bash .envczy mogę sh .envpracować?
Daniel Widrick,
@ IVlint67 Poprawiłem nieco to pytanie.
wodow

Odpowiedzi:

19

Możesz pobrać plik środowiska w aktywnej powłoce i uruchomić program:

sh -ac ' . ./.env; /usr/local/bin/someprogram'

-aPrzełącznik eksportuje wszystkie zmienne, dzięki czemu są one dostępne w programie.

Marco
źródło
3
bash -ac 'source .env && ./program'
fiatjaf
@fiatjaf Dlaczego miałbyś używać bash w tym przypadku, jeśli powłoka POSIX wykonuje to zadanie i nie potrzebujesz żadnej funkcji, która faktycznie wymaga bash? Ponadto bash nie jest domyślnie dostępny we wszystkich systemach (np. FreeBSD).
Marco
Och, słusznie, ma sens, więc myślę, że twoja droga jest lepsza. Właśnie zapewniłem alternatywę dla Bash, ponieważ pisanie jej było dla mnie wygodniejsze.
fiatjaf
2

Inną alternatywą jest envdir:

envdir uruchamia inny program ze środowiskiem zmodyfikowanym zgodnie z plikami w określonym katalogu.

wodow
źródło
Ten post wymienia kilka dodatkowych funkcji pomiędzy envdir, runitoraz chpst; mianowicie zdolność do zmiany zmiennych środowiska odzwierciedlają stan uruchomionego procesu. Post dotyczy dokera, ale nie ogranicza się do dokera. blog.ghaering.de/post/docker-as-vm [archive.org: web.archive.org/web/20190321165332/https://blog.ghaering.de/… ]
driftcatcher
2

Próbowałem source .envi zadziałało to jak urok. Niestety żadne z innych opublikowanych tutaj rozwiązań nie działało dla mnie.

Shouvik
źródło
0

To działa:

env $(cat .env | tr "\\n" " ") myprogram

ale oczywiście nie sprawdza .envpoprawności formatu pliku, co zrobiłby program narzędziowy.

wodow
źródło
1) To catnie jest konieczne, po prostu napisz tr "\\n" " " < .env2) Dzieje się tak, jeśli używane są przypisania wieloliniowe.
Marco