Das setzen von Umgebungsvariablen aus der Datei von Schlüssel/Wert-Paaren
TL;DR: Wie Exportiere ich einen Satz von Schlüssel/Wert-Paare aus einer text-Datei in der shell-Umgebung?
Für das Protokoll, die unten ist die original-version von der Frage, mit Beispielen.
Ich Schreibe ein Skript in bash welche Dateien analysiert, mit 3 Variablen in einem bestimmten Ordner, dieser ist einer von Ihnen:
MINIENTREGA_FECHALIMITE="2011-03-31"
MINIENTREGA_FICHEROS="informe.txt programa.c"
MINIENTREGA_DESTINO="./destino/entrega-prac1"
Diese Datei gespeichert ist ./conf/prac1
Mein script minientrega.sh dann analysiert die Datei mit diesem code:
cat ./conf/$1 | while read line; do
export $line
done
Aber wenn ich ausführen minientrega.sh prac1
in der Befehlszeile ist es nicht die Umgebungsvariablen
Ich auch versucht, mit Hilfe source ./conf/$1
aber das gleiche problem immer noch gilt
Vielleicht gibt es eine andere Möglichkeit, dies zu tun, brauche ich nur die Verwendung der environment-Variablen die Datei gebe ich als argument für mein script.
- Gleiche unter unix: unix.stackexchange.com/questions/31797/...
- Gleiche mit Ruby: stackoverflow.com/questions/2139080/..., ein Juwel, das tut es: github.com/bkeepers/dotenv
- Dies ist eine große Frage aber ist so formuliert, übrigens auch konkret, mit bestimmten Variablen-Namen ("MINIENTREGA_FECHALIMITE"? was bedeutet das?) und zahlen (3). Die Allgemeine Frage ist einfach, "Wie Exportiere ich einen Satz von Schlüssel/Wert-Paare aus einer text-Datei in der shell-Umgebung".
- Auch dies hat bereits beantwortet wurden unix.SE und ist wohl mehr on-topic gibt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Problem mit deinem Ansatz ist die
export
imwhile
Schleife geschieht in einer sub-shell und die variable ist nicht verfügbar in der aktuellen shell - (parent-shell while-Schleife).Hinzufügen
export
Befehl in der Datei selbst:Dann müssen Sie die Quelle in der Datei in der aktuellen shell:
ODER
export
ist nicht ideal, das problem kann auch behoben werden, indem Sie einfach die Eingabe-Umleitung auf der Schleife:while read line; do ... ; done < ./conf/$1
.< <(commands that generate output)
set -o allexport
export
brechen würde es für Dinge wie Java, SystemD, oder andere toolsDieser hilfreich sein könnten:
Grund, warum ich diese wenn ich wollt zu testen
.env
Sachen in meinem rails-Konsole.gabrielf kam mit ein guter Weg, um die lokale Variablen. Dies behebt das potentielle problem, wenn man von Projekt zu Projekt.
Ich habe getestet dieses mit
bash 3.2.51(1)-release
Update:
Ignorieren Zeilen, die beginnen mit
#
verwenden Sie diese (Dank Pete ' s Kommentar):Und wenn Sie wollen
unset
alle Variablen in der Datei definiert wurden, verwenden Sie diese:Update:
Zu handhaben auch Werte mit Leerzeichen, verwenden Sie:
auf GNU-Systemen-oder:
auf BSD-Systemen.
xargs
?export $(cat .env)
aber ich weiß nicht, wie man das Angebot mit Leerzeichen.-d
für die Einstellung der Trennzeichen, also ich versucheenv $(cat .env | xargs -d '\n') rails
, aber es immer noch Fehler mit einer Datei nicht gefunden, wenn.env
Leerzeichen. Keine Ahnung warum das nicht funktioniert?sed
um sicherzustellen, dass es funktioniert, wenn jemand vergisst zu zitieren.eval $(cat .env) rails
cat .env
Lesen Sie die.env
- Datei, dann werden wir das Rohr das Ergebnisxargs
was ist ein Helfer-tool zu konstruieren, cli-Argumente. Schließlich passieren wir sowohl die Argumente und den Befehl ausführen, umenv
lädt die Umgebungsvariablen und führt den Befehl aus.env
oderexport
aber mit dereval
Lösung funktioniert (und es macht Sinn, warum). Wenn Sie exportieren wollte jeder der Variablen, anstatt Sie in einem lokalen Skript, könnte Sie wahrscheinlich einige voranstellen (mitsed
?) in der subshell vor dem Aufruf von eval auf.bash
undzsh
. Ich kann Leben ohne die Leerzeichen, aber wenn möglich, kann man einen Charakter wie_
und code verwenden, um es zu ersetzen, nicht sehr schlank und bläht den code, aber es sollte funktionieren.source .env
Lösung löst dieses Problem, in zsh, scheint nicht zu brauchenset -o allexport
. @selvan isteval
Lösung scheint auch für die Arbeit mit Leerzeichen zu.export $(grep -v "^#" .env | xargs)
USERNAME=corp\foo
dies funktioniert gut, mit so etwas wie dotenv, aber es verwandelt sich inUSERNAME=corpfoo
bei der Verwendung dieser export-cat trick.| xargs
benötigt wird: sonst wird das hier zu bewerten, um so etwas wieexport FOO='bar'\nSECONDVARIABLE='hi'
, die hat einen anderen Effekt alsexport FOO='bar' SECONDVARIABLE='hi'
.xargs -d '\n'
auf GNU oderxargs -0
auf BSD statt.xargs -0
auf BSD, aber die folgende funktioniert:env -S "$(cat .env)"
(export $(cat .env | xargs) && rails c)
([^=]*)
statt(.*)
in unset Skript, da Werte enthalten kann, = - Zeichen, aber die Tasten nicht. Auch, nicht gierig(.*?)=
matching funktioniert nicht im POSIX-Regexps.alias load_env='export $(grep -v "^#" .env | xargs -d "\n")'
.env
- Datei beinhaltet so etwas wiesad=-----123
REACT_APP_IFRAME_URI="http://localhost:3000"
. Die Zitate wurden analysiert, das war nicht beabsichtigt.-o allexport
ermöglicht es, alle folgenden Variablen-Definitionen werden exportiert.+o allexport
deaktiviert diese Funktion..env
Datei hat Kommentare es. Danke!set -o allexport; source conf-file; set +o allexport
set -a; . conf-file; set +a
.(set -a && . .env && ...)
.Wenn
env.txt
ist wie:allexport
. In anderen Worten, jede variable Zuordnung in der shell istexport
ed in die Umgebung (für die Verwendung durch mehrere Kind-Prozesse). Siehe auch diesen Artikel gnu.org/software/bash/manual/html_node/The-Set-Builtin.htmlDen
allexport
option ist erwähnt in ein paar anderen Antworten hier, für dieset -a
ist die Verknüpfung. Beschaffung der .env ist wirklich besser als Schleifen über Zeilen-und exportieren, weil es erlaubt, für Kommentare, leere Zeilen und auch environment-Variablen generiert, die von Befehlen. Meine .bashrc enthält die folgenden:VAR=
.eval $(cat .env | sed 's/^[^$]/export /')
können Sie Leerzeilen für bessere Lesbarkeit.cat .env | sed 's/^[^$]/export /'
Streifen aus das erste Zeichen. I. e. für eine DateiA=foo\nB=bar\n
bekomme ichexport =foo\nexport =bar\n
. Dies funktioniert umso besser, für das überspringen von leeren Zeilen:cat .env | sed '/^$/! s/^/export /'
.cat
in jedem Fall:eval $(sed 's/^/export /' .env)
funktioniert genauso gut.)Hier ist ein weiterer
sed
Lösung, die nicht ausführen, eval oder erfordern ruby:Fügt diese zu exportieren, halten Sie Kommentare, Linien, beginnend mit einem Kommentar.
.env Inhalt
Probe Gefahren
Fand ich dies besonders nützlich beim erstellen einer solchen Datei für das laden in einem systemd-unit-Datei, die mit
EnvironmentFile
.Habe ich von Ihnen positiv bewertet werden user4040650 die Antwort, denn es ist sowohl einfach, und es können Kommentare in der Datei (D. H. Zeilen, die mit # beginnen), was sehr wünschenswert ist, für mich, als Kommentare, die erklären, die Variablen, die Hinzugefügt werden können. Gerade umschreiben im Kontext der ursprünglichen Frage.
Wenn das Skript callled wie angegeben:
minientrega.sh prac1
, dann minientrega.sh haben könnte:Folgenden wurde extrahiert aus der Satz Dokumentation:
Und dies auch:
SAVE=$(set +o) && set -o allexport && . .env; eval "$SAVE"
Diese speichern/wiederherstellen der ursprünglichen Optionen, was auch immer Sie sein mögen.
Mit
set -o allexport
hat den Vorteil, richtig überspringen Kommentare ohne regex.set +o
von selbst-Ausgänge alle aktuellen Optionen, die in einem format, das bash kann später ausgeführt werden. Auch praktisch:set -o
von selbst, Ausgänge alle aktuellen Optionen, die in der human-friendly format.exec env -i bash
deaktivieren Sie die vorhandene Umgebung vor dem Aufrufeval
wenn Sie unset Variablen, die nur innerhalb.env
.Verbesserung auf Silas Paul ' s Antwort
exportieren Sie die Variablen an eine subshell macht Sie lokal auf den Befehl.
(export $(cat .env | xargs) && rails c)
Einfacher:
export
alle Linieneval
die ganze Sacheeval $(cat .env | sed -e /^$/d -e /^#/d -e 's/^/export /')
Andere option (die Sie nicht haben ausführen
eval
(Dank an @Jaydeep)):Schließlich, wenn Sie wollen, um Ihr Leben WIRKLICH einfach, fügen Sie diese zu Ihrem
~/.bash_profile
:function source_envfile() { export $(cat $1 | sed -e /^$/d -e /^#/d | xargs); }
(STELLEN SIE SICHER, LADEN SIE IHRE BASH-EINSTELLUNGEN!!!
source ~/.bash_profile
oder.. Mach einfach einen neuen tab/Fenster und das problem ist gelöst) rufen Sie es wie folgt:source_envfile .env
source <( echo $(sed -E -n 's/[^#]+/ &/ p' <(echo "${2}" | tr -d '\r')) );
. Irgendwie gitlab spart das Geheimnis variable mit einem windows carriage return, also musste ich trimmen, dass mittr -d '\r'
.Den kürzesten Weg, die ich gefunden habe:
Ihre
.env
Datei:Dann nur
Bonus: Denn es ist eine kurze one-liner, es ist sehr nützlich in
package.json
DateiKönnen Sie Ihre original-Skript die Variablen, aber Sie müssen rufen Sie die folgende Weise (mit stand-alone-Punkt):
Außerdem gibt es möglicherweise ein Problem mit
cat | while read
Ansatz. Ich würde empfehlen, den Ansatzwhile read line; do .... done < $FILE
.Hier ist ein funktionierendes Beispiel:
Gebäude auf andere Antworten, hier ist ein Weg, zu exportieren, die nur eine Teilmenge der Zeilen in einer Datei, einschließlich der Werte mit Leerzeichen wie
PREFIX_ONE="a word"
:Ich habe Probleme mit den früher vorgeschlagenen Lösungen:
$()
macht ein Chaos aus.Hier ist meine Lösung, die ist immer noch ziemlich schrecklich IMO - und nicht lösen das "exportieren" nur ein Kind" behandelte problem Silas (obwohl, können Sie wahrscheinlich führen Sie es in einer sub-shell zu beschränken):
Leerzeichen im Wert
Es gibt viele gute Antworten hier, aber ich fand Sie alle fehlenden Unterstützung für Leerraum im Wert:
Habe ich 2 Lösungen gefunden, die arbeiten mit solcher Werte, mit Unterstützung für leere Zeilen und Kommentare.
Basierend auf der sed und @javier-buzzi Antwort:
Und mit read in einer Schleife basierend auf dem @john1024 Antwort
Hier der Schlüssel liegt im Umgang mit
declare -x
- und putting-Zeile in Anführungszeichen gesetzt werden. Ich weiß nicht warum, aber wenn Sie formatieren der code der Schleife, um mehrere Zeilen funktioniert es nicht — ich bin kein bash-Programmierer, den ich gerade verschlungen zusammen mit diesen, ist es immer noch ein Wunder für mich 🙂sed
Lösung, um es zu arbeiten. Doch zunächst einige Erklärungen:-e
ist die Abkürzung für--expression
, die nur sagtsed
welche Vorgänge zu nehmen.-e /^$/d
löscht die Leerzeilen aus der Ausgabe (nicht die Datei).-e /^#/d
löscht die bash-Kommentare (Zeilen, die mit # beginnen) aus der Ausgabe.'s/.*/declare -x "&"/g'
ersetzt (substitute) die restlichen Zeilen mitdeclare -x "ENV_VAR="VALUE""
. Wenn Sie der Quelle dieser, zumindest für mich, es hat nicht funktioniert. Stattdessen musste ichsource <(sed -e /^$/d -e /^#/d -e 's/.*/declare -x &/g' .env)
zu entfernen, die gegen"
wrapper.ENV_VAR="lorem ipsum"
habe ichENV_VAR=lorem ipsum
ohne Anführungszeichen in die .env-Datei. Ich bin mir jetzt nicht sicher, warum, aber das war wahrscheinlich problematisch in andere tools, die diese Datei analysieren. Und stattlorem ipsum
ich habe endete mit"lorem ipsum"
Wert – mit Anführungszeichen. Thx für die Erklärungen 🙂ENV_VAR="lorem ipsum"
entweder. In meinem Anwendungsfall, mein hosting-Anbieter generiert diese Datei, basierend auf ein paar Konfigurations-Optionen, die ich eingestellt haben, und legen Sie die doppelten Anführungszeichen. Also, ich bin gezwungen, das zu umgehen. Vielen Dank für Eure Hilfe hier - mich gerettet eine Menge Zeit, die versucht, herauszufinden, die richtigesed
Optionen mich!Meine Anforderungen waren:
export
Präfixe (für die Kompatibilität mit dotenv)Voll funktionsfähige version, zusammengestellt aus den Antworten oben:
Erstellen Sie zuerst eine environment-Datei, die alle Schlüssel-Wert-paar in der Umgebung wie unten aufgeführt und benannt, was Sie wie in meinem Fall
env_var.env
Dann ein Skript erstellen, das exportieren der Umgebungsvariablen für python-Umgebung wie unten aufgeführt und nennen Sie es wie
export_env.sh
Diesem Skript werden die ersten argument, wie die Umwelt-Datei, dann exportieren Sie die Umgebungsvariable in der Datei und dann den Befehl ausführen, nachdem die.
VERWENDUNG:
Ich die Arbeit mit docker-zu Komponieren und zu
.env
- Dateien auf Mac, und importieren wollten die.env
in meine bash-shell (für die Prüfung), und die "beste" Antwort war hier stolpern, auf die folgenden Variablen:.env
Lösung
So landete ich mit
eval
, und packe meine env var defs in einfache Anführungszeichen gesetzt werden.Bash-Version
Wenn Sie bekommen eine Fehlermeldung, da eine der Variablen einen Wert enthält, enthält Leerzeichen Sie können versuchen, das zurücksetzen bash ist
IFS
(Internal Field Separator) zu\n
zu lassen bash interpretierencat .env
Ergebnis als eine Liste von Parametern für dieenv
ausführbare Datei.Beispiel:
Siehe auch:
Stieß ich auf diesen thread, wenn ich versuche wiederverwenden Andockfenster
--env-file
s in einer Hülle. Ihr format ist nicht bash-kompatibel, aber es ist einfach:name=value
, nicht zitieren, keine substitution. Sie ignorieren auch leere Zeilen und#
Kommentare.Konnte ich es nicht ganz verstanden posix-kompatibel, aber hier ist eine, die Arbeit in der bash-shells (getestet in zsh auf OSX 10.12.5 und bash unter Ubuntu 14.04):
Es nicht behandeln von drei Fällen in dem Beispiel aus dem oben verlinkten docs:
bash: export: `123qwe=bar': not a valid identifier
bash: export: `org.spring.config=something': not a valid identifier
FOO
)Meine .env:
Aufrufen:
Referenz https://unix.stackexchange.com/questions/79068/how-to-export-variables-that-are-set-all-at-once