Ich verwende bash
und 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 KEY
und 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 export
und declare
den Namen der Variablen in ihre Ausgaben aufnehmen, was für mich nicht gut ist.)
echo -- "$KEY"
würde nicht helfen. Es würde ausgeben-- -n
.-- -n
printf
immer besser ist, alsecho
wenn Sie nicht die vollständige Kontrolle darüber haben, welche Eingabe Sie drucken möchten.rc
Klon für Unix und seine Unterstützung für es / akanga-Derivateecho --
. Frühere Versionen vonzsh
taten 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.Antworten:
Wenn es gespeichert wird, um es später (in einem
bash
Skript)declare -p KEY
einzulesen, verwenden Sie einfach die Datei und geben Sie sie als Quelle ein, um sie erneut einzulesen. Wenn Sie nur den Wert speichern möchten, verwendenprintf '%s\n' "$KEY"
Sie ihn wie bei der Ausgabe variabler Daten.Damit,
oder
oder was auch immer Sie ausgeben müssen.
Ihr Problem tritt auf, da dies
-n
eine gültige Option fürecho
in istbash
. Aus dem gleichen Grund würden auch die Zeichenfolgen-e
und-E
(und Kombinationen wie-neEne
) Probleme verursachenbash
. Abhängig von der Art und Weise derbash
Erstellung 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:
quelle
Viele Systeme verfügen über einen
printenv
Befehl, der den Inhalt der angegebenen Umgebungsvariablen gefolgt von einem Zeilenumbruchzeichen in die Standardausgabe ausgibt (printenv
erschienen in 3BSD Ende der 70er Jahre):Würde den Inhalt der
My Env Var
Variablen, gefolgt von NL, infile
allen 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:(Wenn die Variable nicht gesetzt ist, wird immer noch eine leere Zeile in gespeichert.
file
)In-
rc
like-Shells (wobei alle Shell-Variablen Umgebungsvariablen zugeordnet sind):(gleiche Einschränkung wie oben)
In-
csh
like Muscheln:(Wenn die Variable nicht gesetzt ist, schlägt sie fehl und wird nicht überschrieben.
file
)Einige Implementierungen / Versionen von
ksh
haben keineprintf
eingebauten. In diesen könnten Sie auch tun:quelle