1149 Stimmen

Set Umgebungsvariablen aus einer Datei mit Paaren von Schlüssel/Wert.

TL;DR: Wie exportiere ich einen Satz von Schlüssel/Wert-Paaren aus einer Textdatei in die Shell-Umgebung?


Zur Information, hier ist die ursprüngliche Version der Frage mit Beispielen.

Ich schreibe ein Skript in bash, das Dateien mit 3 Variablen in einem bestimmten Ordner analysiert, dies ist eine davon:

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

Diese Datei ist in ./conf/prac1 gespeichert

Mein Skript minientrega.sh analysiert die Datei dann mit diesem Code:

cat ./conf/$1 | while read line; do
    export $line
done

Aber wenn ich minientrega.sh prac1 in der Befehlszeile ausführe, werden die Umgebungsvariablen nicht gesetzt

Ich habe auch versucht, source ./conf/$1 zu verwenden, aber das gleiche Problem tritt immer noch auf

Vielleicht gibt es einen anderen Weg, dies zu tun, ich muss einfach die Umgebungsvariablen der Datei verwenden, die ich als Argument meines Skripts übergebe.

1634voto

Silas Paul Punkte 15069

Dies könnte hilfreich sein:

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

Grund warum ich das benutze ist, wenn ich Dinge in meiner Rails-Konsole testen möchte, die in der .env stehen.

gabrielf hat einen guten Weg gefunden, um die Variablen lokal zu halten. Dies löst das potenzielle Problem, wenn man von Projekt zu Projekt wechselt.

env $(cat .env | xargs) rails

Ich habe dies mit bash 3.2.51(1)-release getestet


Aktualisierung:

Um Zeilen zu ignorieren, die mit # beginnen, verwenden Sie dies (danke an Pete's Kommentar):

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

Und wenn Sie alle Variablen, die in der Datei definiert sind, unset möchten, verwenden Sie dies:

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

Aktualisierung:

Um auch Werte mit Leerzeichen zu verarbeiten, verwenden Sie:

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

auf GNU-Systemen - oder:

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

auf BSD-Systemen.


Aus dieser Antwort können Sie das Betriebssystem mit folgendem Script automatisch erkennen:

export-env.sh

#!/bin/sh

## Verwendung:
##   . ./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' ] || [ "$unamestr" = 'Darwin' ]; then

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

fi

1016voto

user4040650 Punkte 9521

-o allexport aktiviert die Exportierung aller folgenden Variablendefinitionen. +o allexport deaktiviert diese Funktion.

set -o allexport
source conf-file
set +o allexport

377voto

anubhava Punkte 713155

Das Problem bei Ihrem Ansatz ist, dass das export in der while-Schleife in einer Unter-Shell erfolgt und diese Variablen in der aktuellen Shell (übergeordnete Shell der while-Schleife) nicht verfügbar sein werden.

Fügen Sie den export-Befehl direkt in die Datei ein:

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

Dann müssen Sie die Datei in der aktuellen Shell mit folgendem Befehl einbinden:

. ./conf/prac1

ODER

source ./conf/prac1

331voto

Dan Kowalczyk Punkte 4093
set -a
. ./env.txt
set +a

Wenn env.txt so aussieht:

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

Erklärungen -a entspricht allexport. Mit anderen Worten, jede Variablenzuweisung in der Shell wird in die Umgebung exportiert (um von mehreren untergeordneten Prozessen verwendet zu werden). Weitere Informationen finden Sie in der Dokumentation des Set-Builtins:

-a     Jede erstellte oder geänderte Variable oder Funktion erhält das Exportattribut und wird für die Ausgabe in die Umgebung nachfolgender Befehle markiert.

Wenn anstelle von ‘-’ ‘+’ verwendet wird, werden diese Optionen deaktiviert. Die Optionen können auch beim Aufruf der Shell verwendet werden. Der aktuelle Satz von Optionen befindet sich in $-.

117voto

Huan Punkte 2488

Ich fand, dass der effizienteste Weg ist:

export $(xargs < .env)

Erklärung

Wenn wir eine .env Datei wie diese haben:

key=val
foo=bar

Ausführen von xargs < .env wird key=val foo=bar ergeben

so erhalten wir ein export key=val foo=bar und das ist genau das, was wir brauchen!

Einschränkung

  1. Es behandelt nicht Fälle, in denen die Werte Leerzeichen enthalten. Befehle wie env erzeugen dieses Format. - @Shardj

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X