Gibt es eine einfache Möglichkeit, Umgebungsvariablen in einer Datei zu ersetzen / auszuwerten? Angenommen, ich habe eine Datei config.xml
, die Folgendes enthält:
<property>
<name>instanceId</name>
<value>$INSTANCE_ID</value>
</property>
<property>
<name>rootPath</name>
<value>/services/$SERVICE_NAME</value>
</property>
...etc. Ich möchte $INSTANCE_ID
in der Datei den Wert der INSTANCE_ID
Umgebungsvariablen $SERVICE_NAME
durch den Wert der SERVICE_NAME
env var ersetzen . Ich weiß nicht von vornherein, welche Umgebungsvariablen benötigt werden (oder vielmehr, ich möchte das Skript nicht aktualisieren müssen, wenn jemand der Konfigurationsdatei eine neue Umgebungsvariable hinzufügt). Vielen Dank!
shell-script
text-processing
scripting
environment-variables
Robert Fraser
quelle
quelle
Antworten:
Sie könnten
envsubst
(einen Teil vongnu gettext
) verwenden:werden die Umgebungsvariablen in Ihrer Datei durch ihren entsprechenden Wert ersetzen. Die Variablennamen dürfen nur aus alphanumerischen Zeichen oder ASCII-Zeichen mit Unterstreichung bestehen, nicht mit einer Ziffer beginnen und nicht leer sein. Andernfalls wird eine solche Variablenreferenz ignoriert.
Informationen zum Ersetzen nur bestimmter Umgebungsvariablen finden Sie in dieser Frage.
quelle
^[[:alpha:]_][[:alnum:]_]*$
im POSIX-Gebietsschema übereinstimmt .Das ist nicht sehr schön, aber es funktioniert
Wenn es in einem Shell-Skript wäre, würde es so aussehen:
Bearbeiten, zweiter Vorschlag:
Bearbeiten, nicht streng auf die Frage bezogen, aber bei Variablen, die aus der Datei gelesen werden:
quelle
EOF
, die restlichen Zeilen von der Shell als Befehle ausgeführt werden. Wir könnten das Trennzeichen in etwas längeres oder komplizierteres ändern, aber es gibt immer noch eine theoretische Möglichkeit einer Kollision. Und jemand könnte absichtlich eine Datei mit dem Trennzeichen erstellen, um Befehle auszuführen."; ls ;"
in die Datei einzufügen, undeval
wiederholen Sie den Befehl :) Dies ist fast das gleiche Problem wie bei SQL-Injection-Angriffen. Sie müssen wirklich vorsichtig sein , wenn die Daten mit dem Code Mischen (und das ist , was Befehle Shell sind), es sei denn , du bist wirklich , wirklich sicher , niemand versucht , bis Sie Ihren Tag etwas zu verwirren zu tun.`"; ls ;"`
- die Kommentarformatierung aß die Backticks. Aber eigentlich sollte das nur`ls`
hier sein. Der Punkt ist, dass der Inhalt der Datei zur Ausführung von willkürlichem Code führt und Sie nichts dagegen tun können.Wenn Sie zufällig Perl haben (aber nicht gettext und
envsubst
), können Sie dies einfach durch ein kurzes Skript ersetzen:Ich nahm an, dass die Variablennamen nur Großbuchstaben und Unterstriche enthalten, aber das erste Muster sollte sich bei Bedarf leicht ändern lassen.
$ENV{...}
verweist auf die Umgebung, die Perl sieht.Wenn Sie die
${...}
Syntax unterstützen oder einen Fehler auf nicht gesetzte Variablen werfen möchten , müssen Sie noch etwas arbeiten. Eine enge Äquivalentgettext
‚senvsubst
wäre:Obwohl ich der Meinung bin, dass die Eingabe derartiger Variablen über die Prozessumgebung im Allgemeinen etwas fragwürdig ist: Sie können in den Dateien keine beliebigen Variablen verwenden (da diese möglicherweise eine spezielle Bedeutung haben), und einige der Werte könnten möglicherweise zumindest eine halbe Bedeutung haben. sensible Daten in ihnen.
quelle
perl -pe 's{\$(\{)?(\w+)(?(1)\})}{$ENV{$2} // $&}ge'
um nur die definierten Variablen zu ersetzen.Darf ich mein eigenes Skript dafür vorschlagen?
https://github.com/rydnr/set-square/blob/master/.templates/common-files/process-file.sh
quelle
Ähnlich wie bei der Perl-Antwort kann die Ersetzung von Umgebungsvariablen an die PHP-CLI delegiert werden. Abhängig vom verwendeten Tech-Stack kann die Abhängigkeit von PHP akzeptabel sein oder auch nicht.
Sie können noch weiter gehen und es in ein wiederverwendbares Skript einfügen, zum Beispiel
envsubst
:Die Verwendung wäre:
quelle