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.

22voto

Flavien Volken Punkte 15992

Der kürzeste Weg, den ich gefunden habe:

Deine .env Datei:

VARIABLE_NAME="A_VALUE"

Dann einfach

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

Bonus: Weil es ein kurzer Einzeiler ist, ist es sehr nützlich in der package.json Datei

  "scripts": {
    "echo:variable": ". ./.env && echo ${VARIABLE_NAME}"
  }

Hinweis: Auf diese Weise werden die Variablen nicht an den Unterprozess exportiert, prüfen Sie andere Antworten, wenn dies Ihr Bedarf ist.

21voto

Nagev Punkte 6680

Ich habe die Antwort von Benutzer4040650 hochgewertet, weil sie sowohl einfach ist als auch Kommentare in der Datei zulässt (d.h. Zeilen, die mit # beginnen), was für mich sehr wünschenswert ist, da Kommentare, die die Variablen erklären, hinzugefügt werden können. Ich schreibe es nur im Kontext der Ursprungsfrage um.

Wenn das Skript wie angegeben aufgerufen wird: minientrega.sh prac1, dann könnte minientrega.sh folgendes enthalten:

set -a # exportiere alle erstellten Variablen
source $1
set +a # Export beenden

# Test ob es funktioniert
echo "Ficheros: $MINIENTREGA_FICHEROS"

Folgendes wurde aus der set-Dokumentation extrahiert:

Dieses eingebaute Befehl ist so kompliziert, dass es einen eigenen Abschnitt verdient. set ermöglicht es Ihnen, die Werte von Shell-Optionen zu ändern und die positionalen Parameter zu setzen oder die Namen und Werte von Shell-Variablen anzuzeigen.

set [--abefhkmnptuvxBCEHPT] [-o Option-Name] [Argument …] set [+abefhkmnptuvxBCEHPT] [+o Option-Name] [Argument …]

Wenn keine Optionen oder Argumente bereitgestellt werden,zeigt set die Namen und Werte aller Shell-Variablen und Funktionen an, sortiert nach dem aktuellen Gebietsschema, in einem Format, das als Eingabe für das Setzen oder Zurücksetzen der aktuell gesetzten Variablen wieder verwendet werden kann. Schreibgeschützte Variablen können nicht zurückgesetzt werden. Im POSIX-Modus werden nur Shell-Variablen aufgelistet.

Wenn Optionen angegeben werden, setzen oder entfernen sie Shell-Attribute. Die Optionen haben folgende Bedeutungen:

-a Jede erstellte oder modifizierte Variable oder Funktion wird mit dem Exportattribut versehen und für die Exportierung in die Umgebung nachfolgender Befehle markiert.

Und auch dies:

Das Verwenden von ‘+’ anstatt ‘-’ führt dazu, dass diese Optionen deaktiviert werden. Die Optionen können auch beim Start des Shells verwendet werden. Die aktuellen Einstellungen der Optionen sind in $- zu finden.

17voto

jwfearn Punkte 27520

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

Dies speichert/wiederherstellt Ihre ursprünglichen Optionen, egal welche sie sind.

Die Verwendung von set -o allexport hat den Vorteil, Kommentare ohne Regex korrekt zu überspringen.

set +o selbst gibt alle aktuellen Optionen in einem Format aus, das bash später ausführen kann. Auch praktisch: set -o alleine gibt alle aktuellen Optionen im menschenfreundlichen Format aus.

17voto

Jaydeep Solanki Punkte 2821

Verbesserung von Silas Pauls Antwort

Wenn die Variablen in einem Subshell exportiert werden, sind sie lokal für den Befehl verfügbar.

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

14voto

Koichi Nakashima Punkte 591

Verwendung von shdotenv

dotenv Unterstützung für Shell und POSIX-kompatible .env-Syntaxspezifikation
https://github.com/ko1nksm/shdotenv

eval "$(shdotenv)"

Verwendung

Verwendung: shdotenv [OPTION]... [--] [COMMAND [ARG]...]

  -d, --dialect DIALECT  Legen Sie den .env-Dialekt fest [standardmäßig: posix]
                           (posix, ruby, node, python, php, go, rust, docker)
  -s, --shell SHELL      Ausgabe im angegebenen Shell-Format [standardmäßig: posix]
                           (posix, fish)
  -e, --env ENV_PATH     Speicherort der .env-Datei [standardmäßig: .env]
                           Mehrere -e-Optionen sind erlaubt
  -o, --overload         Überlastung vordefinierter Umgebungsvariablen
  -n, --noexport         Schlüssel ohne Exportpräfix nicht exportieren
  -g, --grep PATTERN     Nur die mit dem regulären Ausdrucksmuster übereinstimmenden Ausgaben
  -k, --keyonly          Nur Variablennamen ausgeben
  -q, --quiet            Unterdrücke alle Ausgaben
  -v, --version          Zeige die Version an und beende
  -h, --help             Zeige diese Nachricht an und beende

Anforderungen

shdotenv ist ein einzelnes Shell-Skript mit eingebettetem awk-Skript.

  • POSIX-Shell (dash, bash, ksh, zsh, etc)
  • awk (gawk, nawk, mawk, busybox awk)

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