Ok, anstatt einige lokale Umgebungsvariablen fest zu codieren, die einen Remote-Server (OpenShift-Server) spiegeln, möchte ich dies programmgesteuert tun, damit wir nicht alles manuell auf dem neuesten Stand halten müssen.
Im Moment habe ich dies in einer Datei fest codiert:
#!/usr/bin/env bash
export OPENSHIFT_MONGODB_DB_USERNAME="admin"
export OPENSHIFT_MONGODB_DB_PASSWORD="xyz"
export OPENSHIFT_MONGODB_DB_HOST="emsa-xyz-2-emsa.cloudapps.nabisco.com"
export OPENSHIFT_MONGODB_DB_PORT=60161
Anstatt es fest zu codieren, kann ich die „öffentlichen“ Umgebungsvariablen mit diesem Befehl von OpenShift abrufen:
rhc env list -a <app-name>
das dies auf stdout schreibt:
NODE_ENV=jailbreak
NPM_CONFIG_PRODUCTION=true
OPENSHIFT_MONGODB_DB_HOST=emsa-xyz-2-emsa.cloudapps.nabisco.com
OPENSHIFT_MONGODB_DB_PASSWORD=xyz
OPENSHIFT_MONGODB_DB_PORT=60161
OPENSHIFT_MONGODB_DB_USERNAME=admin
weiß jemand, wie ich diese Standardausgabe nehmen und wiederum jede dieser Variablen exportieren kann?
Ich nehme an, es wäre etwa so: Holen Sie sich jede Zeile, setzen Sie export
sie davor und führen Sie sie dann aus bash -e "export x"
. Das Problem ist, dass es wahrscheinlich in einer Subshell ausgeführt wird und keine Auswirkungen auf die aktuelle Shell hätte?
Die bestehende Antwort auf diese Frage ist gut und sollte nicht verloren gehen.
Antwort1
Wenn Sie der Ausgabe Ihres RHC-Befehls vertrauen, können Sie sie einfach als Quelle angeben:
. <(rhc env list -a <app-name>)
Dadurch wird jede erzeugte Zeile als Quelle verwendet (ausgeführt) rhc
.
Wie geschrieben definiert der obige Code die Variablen, exportiert sie aber nicht. Wir könnten das beheben, aber der folgende Code ist sicherer und führt den Export durch.
Der Quellbefehl .
erwartet eine Datei als Argument. Um die Ausgabe von rhc
in ein dateiähnliches Objekt umzuwandeln, verwenden wirProzesssubstitution: <(...)
.
Verwenden Sie zur höheren Sicherheit:
while read -r line; do declare -x "$line"; done < <(rhc env list -a <app-name>)
Hier verwenden wir Prozesssubstitution, <(...)
, kombiniert mit Eingabeumleitung, <
, so dass die while
Schleife aus der Ausgabe von liest rhc
. Der Abstand zwischen dem ersten und dem zweiten <
ist wichtig: donichtlass es weg.
Die -x
Option to declare
weist bash an,ExportDie Variable.
Reihenfolge ändern
Gemäß dem Kommentar unten kann der Befehl folgendermaßen in die Zeile über der Schleife rhc
eingefügt werden :while
tmpvar=$(rhc env list -a <app-name>)
while read -r line; do declare -x "$line"; done <<<"$tmpvar"
<<<
schafft einehier Zeichenfolge. In diesem Fall bedeutet es, dass $tmpvar
als Eingabe für die Schleife bereitgestellt wird while
.