Wie exportiere ich Variablen aus einer Datei?

80

Ich habe eine tmp.txtDatei mit zu exportierenden Variablen, zum Beispiel:

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

Wie kann ich all diese Variablen mit dem exportBefehl exportieren , damit sie später von untergeordneten Prozessen verwendet werden können?

Neerav
quelle
1
bash --init-file somefile.blah -c "Befehl"
Dillian Murphey
SO hat eine nützliche Antwort darauf, wie Sie Dateien automatisch.envcd in ein Verzeichnis kopieren können.
Dan Dascalescu
@Neerav Bitte akzeptieren Sie die andere Antwort. Das ist eine viel bessere Lösung.
CoderDude

Antworten:

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

Gemessen an Ihrer anderen Frage möchten Sie die Variablennamen nicht hart codieren:

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

Probier es aus:

$ 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
quelle
2
Dies funktioniert beispielsweise nicht, wenn die Umgebungsdatei Kommentare enthält. (z. B. Dateien, die von systemds EnvironmentFile wiederverwendet werden können)
Chris Lamb
3
@ ChrisLamb können Sie verwenden grep, um Kommentare zu überspringen:export $(grep --regexp ^[A-Z] tmp.txt | cut -d= -f1)
gvee
182
set -a
. ./tmp.txt
set +a

set -abewirkt, dass ab jetzt definierte Variablen¹ automatisch exportiert werden. Es ist in jeder Bourne-ähnlichen Shell verfügbar. .ist der Standard- und Bourne-Name für den sourceBefehl, daher bevorzuge ich ihn aus Gründen der Portabilität ( sourcekommt von cshund ist jetzt in den meisten modernen Bourne-ähnlichen Shells verfügbar, auch bashwenn (manchmal mit etwas anderem Verhalten)).

In POSIX-Shells können Sie es auch set -o allexportals beschreibendere Alternative zum Schreiben ( set +o allexportzum Deaktivieren) verwenden.


¹ bashBeachten Sie, dass dadurch auch alle deklarierten Funktionenallexport , die aktiviert sind, in die Umgebung exportiert werden (da BASH_FUNC_myfunction%%Umgebungsvariablen, die dann von allen bashShells importiert werden , in dieser Umgebung ausgeführt werden, auch wenn sie als ausgeführt werden sh).

Stéphane Chazelas
quelle
1

Mach einfach:

while read LINE; do export "$LINE"; done < ./tmp.txt
Benjamin Berhault
quelle
Hast du nachgesehen, ob das funktioniert?
RalfFriedl
@RalfFriedl das sollte funktionieren, warum nicht? Es ist nicht sehr elegant und Sourcing mit set -awäre viel einfacher, aber das funktioniert tatsächlich.
Terdon
Das ist spröde. Es lässt keine Kommentare in der Eingabedatei zu, behandelt Variablenwerte in Anführungszeichen nicht richtig und schlägt bei mehrzeiligen Variablen fehl. Zugegeben, ich habe nicht viele mehrzeilige Variablen, aber ich verwende regelmäßig Kommentare und muss häufig Anführungszeichen für Variablenwerte verwenden.
Louis
Es hat bei mir funktioniert.
Mchawre