bash ermöglicht $'string'
Erweiterung. Mein man bash
sagt:
Worte der Form
$'string'
sind speziell behandelt. Das Wort wird aufstring
erweitert, wobei Zeichen mit Backslash-Escapezeichen wie im ANSI C-Standard angegeben ersetzt werden. Aufkantung Escape-Sequenzen, falls vorhanden, dekodiert werden, wie folgt:
\a
alert (Glocke)
\b
Backspace
\e
\E
ein Escape-Zeichen
\f
Formularvorschub
\n
neue Linie
\r
Wagenrücklauf
\t
horizontale Registerkarte
\v
vertikaler Lasche
\
Backslash
\'
Apostroph
\"
doppeltes Anführungszeichen
\nnn
die Acht-Bit-Zeichen, dessen Wert die Oktalwertnnn
(2.59 digits)
\xHH
die Acht-Bit-Zeichen, das Wert ist der HexadezimalwertHH
(ein oder zwei Hexadezimalzeichen)
\cx
ein Steuer-x
CharakterDas erweiterte Ergebnis ist in einfachen Anführungszeichen, als ob das Dollarzeichen nicht anwesend war.
Aber warum bash nicht $'\0'
und $'\x0'
in ein Null-Zeichen konvertieren?
Ist es dokumentiert? Gibt es einen Grund? (Ist es ein Merkmal oder eine Einschränkung oder sogar ein Bug?)
$ hexdump -c <<< _$'\0'$'\x1\x2\x3\x4_'
0000000 _ 001 002 003 004 _ \n
0000007
echo
das erwartete Ergebnis liefert:
> hexdump -c < <(echo -e '_\x0\x1\x2\x3_')
0000000 _ \0 001 002 003 _ \n
0000007
Meine bash Version
$ bash --version | head -n 1
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
Warum echo $'foo\0bar'
nicht benimmt als echo -e 'foo\0bar'
?
Gute Frage! Vielleicht ist es eine Posix-Sache? Viel Glück. – shellter
Danke für alle Antworten. Ich habe das gleiche Problem bei der Verwendung von Netcat, um die SGCI-Schnittstelle zu einem Server zu testen. Der SCGI-Header hat NUL-Zeichen. Nachdem ich hier gelesen habe, vor allem den Vorschlag, Pipes zu verwenden, habe ich einen Workaround entwickelt. Ich benutze Oktal 377 (ASCII 255), wo die NUL-Zeichen sein müssen, und dann pipe die Zeichenfolge durch tr, kurz bevor es in Netcat Xmlreq = ' Xml version = "1.0" encoding = "UTF-8"?> system.client_version 'scgihdr = CONTENT_LENGTH $' \ 377 '$ {# xmlreq} $' \ 377'SCGI $ '\ 377'1 $' \ 377' echo -n $ {# scgihdr –