Zuweisen Zeichenfolge mit null Zeichen (\0) eine variable in der Bash
Beim Versuch, Prozess, wird eine Liste von Datei-/foldernames richtig (siehe meine anderen Fragen) durch die Verwendung eines NULL-Zeichen als Trennzeichen stolperte ich über ein merkwürdiges Verhalten der Bash, dass ich nicht verstehe:
Wenn Sie einen string mit einem oder mehreren NULL-Zeichen einer Variablen, die NULL-Zeichen verloren /ignoriert /nicht gespeichert.
Beispielsweise
echo -ne "n\0m\0k" | od -c # -> 0000000 n \0 m \0 k
Aber:
VAR1=`echo -ne "n\0m\0k"`
echo -ne "$VAR1" | od -c # -> 0000000 n m k
Dies bedeutet, dass ich hätte schreiben müssen, dass der string in eine Datei (z.B. in /tmp) und Lesen Sie es von dort zurück, wenn die Rohrleitung direkt ist nicht erwünscht oder machbar ist.
Beim ausführen dieser Skripte in Z-shell (zsh) die strings mit \0 sind, erhalten in beiden Fällen, aber leider kann ich nicht davon ausgehen, dass die zsh ist in den Systemen läuft mein Skript beim Bash sein sollte.
Wie können strings mit \0 chars werden gespeichert oder verarbeitet werden effizient ohne Verlust der (meta-) Zeichen?
InformationsquelleAutor der Frage antiplex | 2011-07-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der Bash können Sie nicht speichern Sie das NULL-Zeichen in eine variable.
Sie können jedoch, speichern Sie einen einfachen hex-dump der Daten (und später auch die Umkehrung dieser operation wieder) mit der
xxd
Befehl.InformationsquelleAutor der Antwort jeff
Als andere haben bereits festgestellt, Sie können nicht speichern/verwenden NUL-char:
Jedochdie Sie behandeln können beliebige binäre Daten (einschließlich NUL-char):
Zur Beantwortung deiner letzten Frage:
Können Sie verwenden, Dateien oder pipes lagern und handhaben effizient beliebige Zeichenkette mit beliebigen meta-Zeichen.
Wenn Sie planen, Daten verarbeiten, sollten Sie beachten Sie zusätzlich, dass:
$(command..)
oder`command..`
) einen zusätzlichen twist oben wird eine variable als es werden Essen, Ihr Ende neue Zeilen.Unter Umgehung Einschränkungen
Wenn Sie Variablen verwenden möchten, dann müssen Sie loszuwerden, die NUL-char-Codierung, und verschiedene andere Lösungen hier geben clevere Möglichkeiten, das zu tun (eine offensichtliche Möglichkeit ist zum Beispiel der base64-Codierung/Decodierung).
Wenn Sie sind besorgt über Speicher oder Geschwindigkeit, werden Sie wahrscheinlich wollen, zu einem minimalen parser und nur zitieren, NUL-Zeichen (und das zitieren char). In diesem Fall würde Ihnen helfen:
Dann schützen Sie Ihre Daten vor dem speichern Sie Sie in Variablen und
command-line-argument von Rohrleitungen sind Ihre sensiblen Daten in
quote
, die Ausgabe wird eine sichere Daten-stream ohne NUL chars. Sie können wiederdie ursprüngliche Zeichenfolge (mit NUL-Zeichen) mithilfe
echo -en "$var_quoted"
die schicken den richtigen string auf die standard-Ausgabe.Beispiel:
Hinweis: verwenden Sie
| hd
um eine saubere Sicht auf Ihre Daten in hexadezimal-undüberprüfen Sie, dass Sie nicht verlieren alle NUL-Zeichen.
Wechseln von Werkzeugen
Denken Sie daran, Sie können gehen ziemlich weit mit Rohren ohne Verwendung von Variablen noch argument in der Kommandozeile, vergessen Sie nicht, zum Beispiel die
<(command ...)
konstruieren, die eine named pipe erstellen (eine Art temporäre Datei).EDIT: die erste Implementierung von
quote
falsch war und würde es nicht um richtig mit\
Sonderzeichen interpretiert vonecho -en
. Danke @xhienne für Schmierblutungen.InformationsquelleAutor der Antwort vaab
Verwenden
uuencode
unduudecode
für POSIX-Portabilitätxxd
undbase64
nicht POSIX-7 aber uuencode ist.Ausgabe:
Leider sehe ich nicht ein POSIX-7 alternativen für die Bash-Prozess
<()
substitution Erweiterung außer beim schreiben in Datei, und Sie werden nicht installiert in Ubuntu 12.04 standardmäßig (sharutils
Paket).Also denke ich, dass die wirkliche Antwort ist: verwenden Sie nicht Bash verwenden Sie dazu Python oder eine andere saner interpretierte Sprache.
InformationsquelleAutor der Antwort Ciro Santilli 新疆改造中心 六四事件 法轮功
Ich Liebe jeff ' s Antwort. Ich würde Base64-Kodierung anstelle von xxd. Es spart ein wenig Platz und würde (denke ich) mehr erkennbar, was beabsichtigt ist.
Als für -e, es ist nicht notwendig, da die shell bereits interpretiert die Flucht, bevor es noch bekommt echo. Auch ich scheine zu erinnern, etwas über "echo -e" als unsicher, wenn Sie echo Benutzereingaben als könnten Sie Spritzen escape-Sequenzen mit echo interpretiert wird und am Ende mit schlechten Dingen.
InformationsquelleAutor der Antwort vontrapp