Ustawianie zmiennych środowiskowych z pliku par klucz / wartość

TL; DR: Jak wyeksportować zestaw par klucz / wartość z pliku tekstowego do środowiska powłoki?


Dla przypomnienia, poniżej znajduje się Oryginalna wersja pytania, z przykładami.

Piszę skrypt w bash, który parsuje pliki z 3 zmiennymi w określonym folderze, jest to jedna z nich:

MINIENTREGA_FECHALIMITE="2011-03-31"
MINIENTREGA_FICHEROS="informe.txt programa.c"
MINIENTREGA_DESTINO="./destino/entrega-prac1"

Ten plik jest przechowywany w ./ conf / prac1

Mój scenariusz minientrega.sh następnie przetwarza plik używając tego kodu:

cat ./conf/$1 | while read line; do
    export $line
done
Ale kiedy execute minientrega.sh prac1 w wierszu poleceń nie ustawia zmiennych środowiskowych

Próbowałem również użyć source ./conf/$1 ale ten sam problem nadal dotyczy

Może jest na to jakiś inny sposób, po prostu potrzebuję użyć zmiennych środowiskowych pliku, który podaję jako argument mojego skryptu.

Author: il--ya, 2013-10-12

30 answers

Problem z twoim podejściem polega na tym, że export W pętli while dzieje się w sub powłoce, a te zmienne nie będą dostępne w bieżącej powłoce (powłoce nadrzędnej pętli while).

Dodaj export polecenie w samym pliku:

export MINIENTREGA_FECHALIMITE="2011-03-31"
export MINIENTREGA_FICHEROS="informe.txt programa.c"
export MINIENTREGA_DESTINO="./destino/entrega-prac1"

Następnie należy pobrać plik w bieżącej powłoce używając:

. ./conf/prac1

Lub

source ./conf/prac1
 255
Author: anubhava,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-11 19:43:06

To może być pomocne:

export $(cat .env | xargs) && rails c

Powodem, dla którego tego używam jest to, że chcę przetestować .env rzeczy w mojej konsoli rails.

Gabrielf wymyślił dobry sposób, aby utrzymać zmienne lokalne. To rozwiązuje potencjalny problem podczas przechodzenia od projektu do projektu.

env $(cat .env | xargs) rails

Przetestowałem to z bash 3.2.51(1)-release


Update:

Aby zignorować linie zaczynające się od #, użyj tego (dzięki komentarza Pete ' a):

export $(grep -v '^#' .env | xargs)

I jeśli chcesz unset wszystkich zmiennych zdefiniowanych w pliku, użyj tego:

unset $(grep -v '^#' .env | sed -E 's/(.*)=.*/\1/' | xargs)

Update:

Aby również obsługiwać wartości ze spacjami, użyj:

export $(grep -v '^#' .env | xargs -d '\n')

Na systemach GNU -- lub:

export $(grep -v '^#' .env | xargs -0)

Na systemach BSD.


From this answer you can auto-detect the OS with this:

export-env.sh

#!/bin/sh

## Usage:
##   . ./export-env.sh ; $COMMAND
##   . ./export-env.sh ; echo ${MINIENTREGA_FECHALIMITE}

unamestr=$(uname)
if [ "$unamestr" = 'Linux' ]; then

  export $(grep -v '^#' .env | xargs -d '\n')

elif [ "$unamestr" = 'FreeBSD' ]; then

  export $(grep -v '^#' .env | xargs -0)

fi

 1029
Author: Silas Paul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-11-23 15:01:18

-o allexport umożliwia eksportowanie wszystkich następujących definicji zmiennych. +o allexport wyłącza tę funkcję.

set -o allexport
source conf-file
set +o allexport
 491
Author: user4040650,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-24 09:09:58
set -a
. ./env.txt
set +a

If env.txt is like:

VAR1=1
VAR2=2
VAR3=3
...

Objaśnienia - a jest równoważne allexport . Innymi słowy, każde przypisanie zmiennej w powłoce jest eksportowane do środowiska (do wykorzystania przez wiele procesów potomnych). Więcej informacji można znaleźć w zbiorze dokumentacji :

-a każda utworzona lub zmodyfikowana zmienna lub funkcja otrzymuje atrybut export i jest oznaczana do eksportu do środowiska kolejnych polecenia.

Użycie ' + 'zamiast' - ' powoduje wyłączenie tych opcji. Opcje mogą być również używane podczas wywoływania powłoki. Bieżący zestaw opcji można znaleźć w$ -.

 203
Author: Dan Kowalczyk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-08 12:29:36

Znalazłem najbardziej skuteczny sposób to:

export $(xargs < .env)

Wyjaśnienie

Gdy mamy .env Plik taki jak:

key=val
foo=bar

Run xargs < .env will get key=val foo=bar

Więc dostaniemy {[5] } i to jest dokładnie to, czego potrzebujemy!

Ograniczenie

  1. nie obsługuje przypadków, w których wartości mają spacje. Polecenia takie jak env wytwarzają ten format. - @Shardj
 41
Author: Huan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-06 06:04:02

Opcja allexport jest wymieniona w kilku innych odpowiedziach tutaj, dla których set -a jest skrótem. Pozyskiwanie ... env jest naprawdę lepszy niż zapętlanie linii i eksportowanie, ponieważ pozwala na komentarze, puste linie, a nawet zmienne środowiskowe generowane przez polecenia. Ojej .bashrc obejmuje:

# .env loading in the shell
dotenv () {
  set -a
  [ -f .env ] && . .env
  set +a
}

# Run dotenv on login
dotenv

# Run dotenv on every new directory
cd () {
  builtin cd $@
  dotenv
}
 38
Author: gsf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-04 16:57:59
eval $(cat .env | sed 's/^/export /')
 27
Author: selvan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-07 10:35:47

Oto inne rozwiązanie sed, które nie uruchamia evalu ani nie wymaga Rubiego:

source <(sed -E -n 's/[^#]+/export &/ p' ~/.env)

Dodaje eksport, zachowując komentarze w wierszach zaczynających się od komentarza.

.zawartość env

A=1
#B=2

Sample run

$ sed -E -n 's/[^#]+/export &/ p' ~/.env
export A=1
#export B=2

Okazało się to szczególnie przydatne przy konstruowaniu takiego pliku do ładowania w pliku systemd unit, Z EnvironmentFile.

 21
Author: tutuDajuju,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-06 16:21:58

Podałem odpowiedź user4040650, ponieważ jest ona zarówno prosta, jak i pozwala na dodawanie komentarzy do pliku (tj. linii zaczynających się od#), co jest dla mnie bardzo pożądane, ponieważ można dodawać komentarze wyjaśniające zmienne. Tylko przepisywanie w kontekście pierwotnego pytania.

Jeśli skrypt zostanie wywołany zgodnie ze wskazaniem: minientrega.sh prac1, to minientrega.sh może mieć:

set -a # export all variables created next
source $1
set +a # stop exporting

# test that it works
echo "Ficheros: $MINIENTREGA_FICHEROS"

Z dokumentacji zestawu wyodrębniono:

Ten budynek jest tak skomplikowany że zasługuje na własną część. set pozwala zmienić wartości opcji powłoki i ustawić parametry pozycyjne, lub wyświetlanie nazw i wartości powłoki zmienne.

Set [--abefhkmnptuvxBCEHPT] [-o option-name] [argument ...] set [+abefhkmnptuvxBCEHPT] [+o option-name] [argument ...]

Jeśli nie podano opcji lub argumentów, set wyświetla nazwy i wartości wszystkich powłok zmienne i funkcje, posortowane według aktualnych ustawień regionalnych, w format, który może być ponownie użyty jako wejście do Ustawienia lub zresetowania aktualnie ustawiane zmienne. Nie można zresetować zmiennych tylko do odczytu. W POSIX tryb, wyświetlane są tylko Zmienne powłoki.

Gdy podano opcje, ustawiają lub wyłączają atrybuty powłoki. Opcje, jeśli są określone, mają następujące znaczenia:

- Każda utworzona lub zmodyfikowana zmienna lub funkcja otrzymuje atrybut export i jest oznaczana do eksportu do środowiska kolejne polecenia.

I to też:

Użycie ' + 'zamiast' - ' powoduje wyłączenie tych opcji. Na opcje mogą być również używane podczas wywoływania powłoki. Obecny zestaw opcji można znaleźć w$ -.

 18
Author: Nagev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-08 11:46:05

Poprawiam odpowiedź Silasa Paula

Eksportowanie zmiennych na podshell czyni je lokalnymi do polecenia.

(export $(cat .env | xargs) && rails c)

 15
Author: Jaydeep Solanki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-21 20:37:00

Najkrótsza droga jaką znalazłem:

Twój .env Plik:

VARIABLE_NAME="A_VALUE"

Wtedy po prostu

. ./.env && echo ${VARIABLE_NAME}

Bonus: ponieważ jest to krótki jednowersowy, jest bardzo przydatny w package.json pliku

  "scripts": {
    "echo:variable": ". ./.env && echo ${VARIABLE_NAME}"
  }
 12
Author: Flavien Volken,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-28 10:56:39

SAVE=$(set +o | grep allexport) && set -o allexport && . .env; eval "$SAVE"

Spowoduje to zapisanie / przywrócenie oryginalnych opcji, niezależnie od tego, jakie mogą być.

Użycie set -o allexport ma tę zaletę, że poprawnie pomija komentarze bez wyrażenia regularnego.

set +o sam wyprowadza wszystkie bieżące opcje w formacie, który bash może później wykonać. Również przydatny: set -o sam w sobie, wyświetla wszystkie bieżące opcje w przyjaznym dla człowieka formacie.

 12
Author: jwfearn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-11 05:56:02

Nie do końca wiem, dlaczego i co przegapiłem, ale po przejściu przez większość odpowiedzi i porażce. Zdałem sobie z tego sprawę.plik env:

MY_VAR="hello there!"
MY_OTHER_VAR=123

Mógłbym po prostu to zrobić:

source .env
echo $MY_VAR

Wyjścia: Hello there!

Wydaje się działać dobrze w Ubuntu linux.

 12
Author: Jules Colle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-06 06:41:42

Oto mój wariant:

  with_env() {
    (set -a && . ./.env && "$@")
  }

W porównaniu z poprzednimi rozwiązaniami:

    Nie powoduje wycieku zmiennych poza zakres (wartości z {[2] } nie są narażone na wywołanie)
  • nie pobiera set opcji
  • zwraca kod zakończenia wykonanego polecenia
  • używa zgodnego z posix set -a
  • używa . zamiast source, aby uniknąć bashism
  • polecenie nie jest wywoływane, jeśli .env ładowanie nie powiedzie się
with_env rails console
 11
Author: glen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-22 14:24:38

Prostsze:

  1. Pobierz zawartość pliku
  2. Usuń puste linie (po prostu okryj oddzielone rzeczy)
  3. usuń wszelkie komentarze (wystarczy dodać kilka...)
  4. dodaj export do wszystkich wierszy
  5. eval całość

eval $(cat .env | sed -e /^$/d -e /^#/d -e 's/^/export /')

Kolejna opcja (nie musisz uruchamiać eval (dzięki @Jaydeep)):

export $(cat .env | sed -e /^$/d -e /^#/d | xargs)

Na koniec, jeśli chcesz, aby twoje życie było naprawdę łatwe, dodaj to do swojego ~/.bash_profile:

function source_envfile() { export $(cat $1 | sed -e /^$/d -e /^#/d | xargs); }

(UPEWNIJ SIĘ, ŻE PRZEŁADOWAŁEŚ USTAWIENIA BASH!!! source ~/.bash_profile lub.. po prostu zrób nową kartę / okno i problem rozwiązany) nazywasz to tak: source_envfile .env

 10
Author: Javier Buzzi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-28 12:36:23

Możesz użyć oryginalnego skryptu, aby ustawić zmienne, ale musisz wywołać go w następujący sposób (z samodzielną kropką):

. ./minientrega.sh

Również może być problem z podejściem cat | while read. Polecam zastosować podejście while read line; do .... done < $FILE.

Oto działający przykład:

> cat test.conf
VARIABLE_TMP1=some_value

> cat run_test.sh
#/bin/bash
while read line; do export "$line";
done < test.conf
echo "done"

> . ./run_test.sh
done

> echo $VARIABLE_TMP1
some_value
 7
Author: Extrapolator,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-11 19:49:53

Bazując na innych odpowiedziach, oto sposób na eksport tylko podzbioru linii w pliku, w tym wartości ze spacjami takimi jak PREFIX_ONE="a word":

set -a
. <(grep '^[ ]*PREFIX_' conf-file)
set +a
 5
Author: Victor Roetman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-09 00:44:25

Moje wymagania to:

  • proste .plik env bez prefiksów export (dla zgodności z dotenv)
  • wartości pomocnicze w cudzysłowach: TEXT= "alpha bravo charlie"
  • wspieranie komentarzy poprzedzonych # i pustymi liniami
  • Uniwersalny Dla mac / BSD i linux / GNU

Pełna wersja robocza opracowana na podstawie powyższych odpowiedzi:

  set -o allexport
  eval $(grep -v '^#' .env | sed 's/^/export /')
  set +o allexport
 5
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-18 10:13:51

Pracuję z plikami docker-compose i .env na Macu i chciałem zaimportować .env do mojej powłoki bash( do testów), a "najlepszą" odpowiedzią było potknięcie się o następującą zmienną:

.env

NODE_ARGS=--expose-gc --max_old_space_size=2048

Rozwiązanie

Więc skończyłem używając eval, i owijając moje ENV var defs pojedynczymi cudzysłowami.

eval $(grep -v -e '^#' .env | xargs -I {} echo export \'{}\')

Wersja Bash

$ /bin/bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
Copyright (C) 2007 Free Software Foundation, Inc.
 5
Author: Nick Grealy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55
t=$(mktemp) && export -p > "$t" && set -a && . ./.env && set +a && . "$t" && rm "$t" && unset t

Jak to działa

  1. Utwórz plik tymczasowy.
  2. zapisuje wszystkie bieżące wartości zmiennych środowiskowych do pliku temp.
  3. umożliwia eksport wszystkich zadeklarowanych zmiennych w skrypcie sources do środowiska.
  4. przeczytaj .env plik. Wszystkie zmienne zostaną wyeksportowane do bieżącego środowiska.
  5. wyłącza eksport wszystkich zadeklarowanych zmiennych w skrypcie sources do środowiska.
  6. odczytaj zawartość pliku tymczasowego. Każda linia miałby declare -x VAR="val", który eksportowałby każdą ze zmiennych do środowiska.
  7. Usuń plik tymczasowy.
  8. Wyłącz zmienną zawierającą Nazwę pliku temp.

Cechy

  • zachowuje wartości zmiennych już ustawionych w środowisku
  • .env może mieć komentarze
  • .env może mieć puste linie
  • .env nie wymaga specjalnego nagłówka ani stopki, jak w innych odpowiedziach (set -a i set +a)
  • .env nie require to have export for every value
  • one-liner
 4
Author: Alex Skrypnyk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-20 22:17:23

Mam problemy z wcześniejszymi sugerowanymi rozwiązaniami:

  • @ anubhava rozwiązanie sprawia, że pisanie przyjaznych dla Basha plików konfiguracyjnych jest bardzo irytujące bardzo szybko , a także-możesz nie chcieć zawsze eksportować swoją konfigurację.
  • @ Silas Paul rozwiązanie łamie się, gdy masz zmienne, które mają spacje lub inne znaki, które dobrze działają w cytowanych wartościach, ale $() robi bałagan.

Oto moje rozwiązanie, które nadal jest dość straszne IMO-i nie rozwiązuje problem" export only to one child " rozwiązany przez Silasa (choć prawdopodobnie możesz go uruchomić w pod-powłoce, aby ograniczyć zakres):

source .conf-file
export $(cut -d= -f1 < .conf-file)
 3
Author: Guss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-28 09:53:19

Mój .env:

#!/bin/bash
set -a # export all variables

#comments as usual, this is a bash script
USER=foo
PASS=bar

set +a #stop exporting variables

Wywołanie:

source .env; echo $USER; echo $PASS

Odniesienie https://unix.stackexchange.com/questions/79068/how-to-export-variables-that-are-set-all-at-once

 3
Author: Tudor Ilisoi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-19 19:40:45

Jeśli env obsługuje opcję -S, można użyć nowych linii lub znaków specjalnych, takich jak \n lub \t (Zobacz env):

env -S "$(cat .env)" command

.env przykład pliku:

KEY="value with space\nnewline\ttab\tand
multiple
lines"

Test:

env -S "$(cat .env)" sh -c 'echo "$KEY"'
 3
Author: gogo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-31 10:09:29

Najpierw Utwórz plik środowiskowy, który będzie miał wszystkie pary klucz-wartość środowisk jak poniżej i nazwij go jak chcesz w moim przypadku jego env_var.env

MINIENTREGA_FECHALIMITE="2011-03-31"
MINIENTREGA_FICHEROS="informe.txt programa.c"
MINIENTREGA_DESTINO="./destino/entrega-prac1"

Następnie Utwórz skrypt, który wyeksportuje wszystkie zmienne środowiskowe dla środowiska Pythona jak poniżej i nada mu nazwę export_env.sh

#!/usr/bin/env bash

ENV_FILE="$1"
CMD=${@:2}

set -o allexport
source $ENV_FILE
set +o allexport

$CMD

Ten skrypt pobierze pierwszy argument jako plik środowiskowy, a następnie wyeksportuje całą zmienną środowiskową w tym pliku, a następnie uruchomi polecenie po to.

Użycie:

./export_env.sh env_var.env python app.py
 2
Author: Anand Tripathi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-20 07:03:21

Modified from @ Dan Kowalczyk

Wstawiłem to ~/.bashrc.

set -a
. ./.env >/dev/null 2>&1
set +a

Bardzo dobrze kompatybilny z wtyczką dotenv Oh-my-Zsh. (Jest Oh-my-bash, ale nie ma wtyczki dotenv.)

 2
Author: Polv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-21 02:18:11

Używam tego:

source <(cat .env \
  | sed -E '/^\s*#.*/d' \
  | tr '\n' '\000' \
  | sed -z -E 's/^([^=]+)=(.*)/\1\x0\2/g' \
  | xargs -0 -n2 bash -c 'printf "export %s=%q;\n" "${@}"' /dev/null)

Pierwsze usunięcie komentarzy:

sed -E '/^\s*#.*/d'

Następnie konwersja do ograniczników null zamiast nowej linii:

tr '\n' '\000'

Następnie zastąpienie equal przez null:

sed -z -E 's/^([^=]+)=(.*)/\1\x0\2/g'

Następnie drukowanie par do poprawnego quoted Bash exports (używając bash printf dla %q):

xargs -0 -n2 bash -c 'printf "export %s=%q;\n" "${@}"' /dev/null
/ Align = "left" /

Powinno działać dla prawie wszystkich przypadków ze wszystkimi znakami specjalnymi.

 2
Author: Iwan Aucamp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-16 12:43:56

Natknąłem się na ten wątek, gdy próbowałem ponownie użyć Dockera --env-filew powłoce. ich format nie jest kompatybilny z bashem, ale jest prosty: name=value, bez cytowania, bez zastępowania. Ignorują również puste linie i komentarze #.

Nie mogłem do końca uzyskać zgodności z posix, ale oto jeden, który powinien działać w powłokach podobnych do Basha (testowane w zsh na OSX 10.12.5 i bash na Ubuntu 14.04):

while read -r l; do export "$(sed 's/=.*$//' <<<$l)"="$(sed -E 's/^[^=]+=//' <<<$l)"; done < <(grep -E -v '^\s*(#|$)' your-env-file)

It nie zajmie się trzema przypadkami w przykładzie z Docs linked powyżej:

  • bash: export: `123qwe=bar': not a valid identifier
  • bash: export: `org.spring.config=something': not a valid identifier
  • Nie będzie obsługiwał składni passthrough (a bare FOO)
 1
Author: Bob Zoller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-23 20:55:25

Białe spacje w wartości

Jest wiele świetnych odpowiedzi tutaj, ale znalazłem je wszystkie brakuje wsparcia dla białej spacji w wartości:

DATABASE_CLIENT_HOST=host db-name db-user 0.0.0.0/0 md5

Znalazłem 2 rozwiązania, które działają z takimi wartościami z obsługą pustych linii i komentarzy.

Jeden oparty na sed i @ javier-buzzi odpowiedź :

source <(sed -e /^$/d -e /^#/d -e 's/.*/declare -x "&"/g' .env)

I jeden z czytaną linią w pętli na podstawie @john1024 odpowiedz

while read -r line; do declare -x "$line"; done < <(egrep -v "(^#|^\s|^$)" .env)

Tutaj klucz jest w użyciu declare -x i umieszczenie linii w podwójnym cytaty. Nie wiem dlaczego, ale po sformatowaniu kodu pętli do wielu linii nie zadziała - nie jestem programistą Basha, po prostu zjadłem je razem, nadal jest to dla mnie Magia :)

 1
Author: Janusz Skonieczny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-11 06:52:43

Spróbuj czegoś takiego

for line in `cat your_env_file`; do if [[ $line != \#* ]];then export $line; fi;done
 1
Author: gaozhidf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-26 12:55:51

Mój .plik env wygląda następująco:

DATABASE_URI="postgres://sa:***@localhost:5432/my_db"
VARIABLE_1="SOME_VALUE"
VALIABLE_2="123456788"

Używając metod @ henke , wyeksportowana wartość kończy się znakiem cudzysłowu "

"postgres://sa:***@localhost:5432/my_db"
"SOME_VALUE"
"123456788"

Ale chcę, aby wyeksportowana wartość zawierała tylko:

postgres://sa:***@localhost:5432/my_db
SOME_VALUE
123456788

Aby to naprawić, edytuję polecenie, aby usunąć cudzysłowy:

export $(grep -v '^#' dev.env | tr --delete '"' | xargs -d '\n')
 1
Author: Ricardo Yanez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-19 13:44:47