Ich möchte den Inhalt einer Variablen (hier aufgerufen var
) in eine Datei kopieren .
Der Name der Datei wird in einer anderen Variablen gespeichert destfile
.
Ich habe Probleme damit. Folgendes habe ich versucht:
cp $var $destfile
Ich habe das gleiche auch mit dem Befehl dd versucht ... Offensichtlich dachte die Shell, dass sie $var
sich auf ein Verzeichnis bezieht, und sagte mir, dass das Verzeichnis nicht gefunden werden konnte.
Wie komme ich darum herum?
$var
einen Dateinamen oder einen Text an, der in eine Datei geschrieben werden soll? Wenn Text angegeben wird, wie lautet dann der Name der Datei, in die Sie diesen Inhalt schreiben möchten?$destdir
sollte es benannt werden,$destfile
damit es nicht irreführend ist ... Der Name$destdir
legt nahe, dass es eher ein Verzeichnis als eine Datei angibt. Dies würde Ihre ganze Frage einfach und leicht verständlich machen.Antworten:
Verwenden Sie den
echo
Befehl:Die
if
Tests,$destdir
die eine Datei darstellen.Der
>
Text wird nach dem Abschneiden der Datei angehängt. Wenn Sie den Text nur$var
an den vorhandenen Inhalt der Datei anhängen möchten , verwenden Sie>>
stattdessen:Der
cp
Befehl wird zum Kopieren von Dateien (in Dateien) verwendet, nicht zum Schreiben von Text in eine Datei.quelle
]
In"$destdir"]
.echo
Fügt Ihrer Variablen auch einen nachgestellten Zeilenumbruch hinzu.$var
ist-e text to append
, und schreibt nicht wirklich-e
echo $var
sich beim Erweitern Ihrer Variablen auf die Shell verlassen, funktioniert dies mit Leerzeichen und Sonderzeichen nicht sehr gut. Sie könnenperl -e 'print($ENV{var})'
stattdessen verwenden, und es wird genau der Wert der Variablen ausgegeben.echo
hat das Problem, dass wenn es sovar
etwas enthält-e
, es als Flag interpretiert wird. Eine andere Option istprintf
,printf "$var" > "$destdir"
erweitert jedoch alle maskierten Zeichen in der Variablen. Wenn die Variable also Backslashes enthält, stimmt der Dateiinhalt nicht überein. Daprintf
Backslashes jedoch nur als Escapezeichen in der Formatzeichenfolge interpretiert werden, können Sie den%s
Formatbezeichner verwenden, um den genauen Variableninhalt in der Zieldatei zu speichern:printf "%s" "$var" > "$destdir"
quelle
echo "$var" > destfile
falsch macht.printf
ist besser, mach weiter.Keine der obigen Antworten funktioniert, wenn Ihre Variable:
-e
-n
-E
\
gefolgt von einemn
Daher können sie nicht für beliebige Zeichenfolgeninhalte verwendet werden.
In Bash können Sie "Here Strings" verwenden als:
Wie im Kommentar unten erwähnt, ist die Antwort von @ Trebawa (formuliert im selben Raum wie meine!)
printf
Ein besserer Ansatz.quelle
printf
overcat
ist, dass Ersteres eine eingebaute Shell ist, die immer schneller ausgeführt wird als eine externe Binärdatei.Wenn ich Sie richtig verstanden habe, möchten Sie
$var
in eine Datei kopieren (wenn es sich um eine Zeichenfolge handelt).quelle
cp
Befehl interpretiert die Shell das erste Argument als Namen einer Datei oder eines Verzeichnisses.$var
Anführungszeichen einfügen, entspricht der Inhalt der Datei in einigen Fällen nicht zu 100% dem Inhalt von $ var. Wenn Sie beispielsweise Variablen "wiedergeben", die RSA-Schlüssel enthalten, erhalten Sie einen ungültigen Schlüssel in der Datei.$var
Leerzeichen enthalten sind oder-e
Wenn Sie "Inhalt einer Variablen kopieren" sagen, enthält diese Variable einen Dateinamen oder einen Dateinamen?
Ich gehe von Ihrer Frage aus,
$var
die den Inhalt enthält, den Sie in die Datei kopieren möchten:Dadurch wird der Wert von $ var in eine Datei mit dem Namen $ destdir übertragen. Beachten Sie die Anführungszeichen. Sehr wichtig, dass "$ var" in Anführungszeichen steht. Auch für "$ destdir", wenn der Name ein Leerzeichen enthält. Um es anzuhängen:
quelle
var
enthält-e
echo
Beenden der Optionsliste löst somit das von @Eric aufgeworfene Problem:echo -- "$var" >> "$destfile"
Alle oben genannten Funktionen funktionieren, müssen jedoch auch ein Problem (Escapezeichen und Sonderzeichen) umgehen, das überhaupt nicht auftreten muss: Sonderzeichen, wenn die Variable durch die Shell erweitert wird. Tun Sie das einfach nicht (variable Erweiterung). Verwenden Sie die Variable direkt ohne Erweiterung.
Wenn Ihre Variable ein Geheimnis enthält und Sie dieses Geheimnis in eine Datei kopieren möchten, möchten Sie möglicherweise keine Erweiterung in der Befehlszeile, da die Ablaufverfolgung / das Befehlsecho der Shell-Befehle das Geheimnis möglicherweise enthüllt. Das heißt, alle Antworten, die
$var
in der Befehlszeile verwendet werden, können ein potenzielles Sicherheitsrisiko darstellen, indem der Inhalt der Variablen der Verfolgung und Protokollierung der Shell ausgesetzt wird.Benutze das:
Das heißt, im Fall der OP-Frage:
quelle