Sicherste Methode zum Speichern von Umgebungsvariablenwerten in einer Datei

7

Ich verwende bashund bin am meisten an einer Antwort interessiert bash, aber Sie können antworten, wie es in anderen Shells gemacht werden soll, wenn Sie möchten.

Ich habe eine Umgebungsvariable KEYund möchte den Wert dieser Umgebungsvariablen in einer Datei speichern. Zur Zeit mache ich

echo "${KEY}" > ./key.pem

In der Praxis scheint dies in Ordnung zu sein, aber theoretisch bricht dies, wenn KEY=-n.

$ export KEY=-n
$ echo BEGIN "${KEY}" END
BEGIN -n END
$ echo "${KEY}" END
END$

Gibt es eine bessere Möglichkeit, den Wert einer einzelnen Umgebungsvariablen in einer Datei zu speichern? (Beachten Sie, dass exportund declareden Namen der Variablen in ihre Ausgaben aufnehmen, was für mich nicht gut ist.)

Alter Pro
quelle
Was wird die Datei verwenden? Wird es verwendet, um den Wert in einem Shell-Skript oder einem anderen Tool erneut festzulegen?
Muru
1
@rewbenn echo -- "$KEY"würde nicht helfen. Es würde ausgeben -- -n.
Kusalananda
1
@Kusalananda, ich bin ein bisschen enttäuscht, dass alle meine Muscheln konstant ausgegeben werden-- -n
ilkkachu
1
Dies ist einer der Gründe, warum dies printfimmer besser ist, alsecho wenn Sie nicht die vollständige Kontrolle darüber haben, welche Eingabe Sie drucken möchten.
Terdon
1
@ilkkachu, der rcKlon für Unix und seine Unterstützung für es / akanga-Derivate echo --. Frühere Versionen von zshtaten dies ebenfalls, aber der End-of-Option-Begrenzer wurde später geändert, -um die Konsistenz mit der Bourne / Korn-Shell und den integrierten Funktionen zu gewährleisten.
Stéphane Chazelas

Antworten:

11

Wenn es gespeichert wird, um es später (in einem bashSkript) declare -p KEYeinzulesen, verwenden Sie einfach die Datei und geben Sie sie als Quelle ein, um sie erneut einzulesen. Wenn Sie nur den Wert speichern möchten, verwenden printf '%s\n' "$KEY"Sie ihn wie bei der Ausgabe variabler Daten.

Damit,

printf '%s\n' "$KEY" >key.pem

oder

printf 'BEGIN %s END\n' "$KEY" >key.pem

oder was auch immer Sie ausgeben müssen.

Ihr Problem tritt auf, da dies -neine gültige Option für echoin ist bash. Aus dem gleichen Grund würden auch die Zeichenfolgen -eund -E(und Kombinationen wie -neEne) Probleme verursachen bash. Abhängig von der Art und Weise der bashErstellung oder der Umgebung oder den Optionen können Backslash-Zeichen in Argumenten ebenfalls ein Problem darstellen.

Diese und weitere Probleme werden in den folgenden Fragen und Antworten beschrieben:

Kusalananda
quelle
5

Viele Systeme verfügen über einen printenvBefehl, der den Inhalt der angegebenen Umgebungsvariablen gefolgt von einem Zeilenumbruchzeichen in die Standardausgabe ausgibt ( printenverschienen in 3BSD Ende der 70er Jahre):

printenv 'My Env Var' > file

Würde den Inhalt der My Env VarVariablen, gefolgt von NL, in fileallen Shells auf diesen Systemen speichern .

Für Umgebungsvariablen, die Shell-Variablen zugeordnet sind (einschließlich mindestens derer, deren Name mit einem ASCII-Buchstaben oder Unterstrich beginnt und auf die 0 oder mehr ASCII-Buchstaben, Ziffern oder Unterstriche folgen und die ansonsten keine von der Shell festgelegten Spezialvariablen sind), in Bourne-ähnliche Muscheln (funktioniert auch in fish), Sie können das gleiche tun mit:

printf '%s\n' "$ENVVAR" > file

(Wenn die Variable nicht gesetzt ist, wird immer noch eine leere Zeile in gespeichert. file)

In- rclike-Shells (wobei alle Shell-Variablen Umgebungsvariablen zugeordnet sind):

printf '%s\n' $ENVVAR > file
printf '%s\n' $'My Env Var' > file

(gleiche Einschränkung wie oben)

In- cshlike Muscheln:

printf '%s\n' $ENVVAR:q > file

(Wenn die Variable nicht gesetzt ist, schlägt sie fehl und wird nicht überschrieben. file)

Einige Implementierungen / Versionen von kshhaben keine printfeingebauten. In diesen könnten Sie auch tun:

print -r -- "$ENVVAR" > file
Stéphane Chazelas
quelle