bash consente l'espansione $'string'
. La mia man bash
dice:
Parole del modulo
$'string'
vengono trattati in modo speciale. La parola si espande instring
, con caratteri di escape rovesciato sostituiti come specificato dallo standard ANSI C. Backslash sequenze di escape, se presenti, vengono decodificati come segue:
\a
avviso (campana)
\b
backspace
\e
\E
un carattere di escape
\f
avanzamento forma
\n
nuova linea
\r
ritorno carrello
\t
scheda orizzontale
\v
scheda verticale
\
rovesciato
\'
apostrofo
\"
doppio apice
\nnn
il carattere a otto bit il cui valore è il valore ottalennn
(una a tre cifre)
\xHH
il carattere a otto bit il cui valore è il valore esadecimaleHH
(una o due cifre esadecimali)
\cx
un controllo-x
carattereIl risultato è esteso tra apici singoli, come se il simbolo del dollaro non era stato presente.
Ma Perché bash non convertire $'\0'
e $'\x0'
in un carattere null?
È documentato? C'è una ragione? (Si tratta di una funzione o di una limitazione o addirittura un bug?)
$ hexdump -c <<< _$'\0'$'\x1\x2\x3\x4_'
0000000 _ 001 002 003 004 _ \n
0000007
echo
dà il risultato atteso:
> hexdump -c < <(echo -e '_\x0\x1\x2\x3_')
0000000 _ \0 001 002 003 _ \n
0000007
La mia versione bash
$ bash --version | head -n 1
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
Perché echo $'foo\0bar'
non si comporta come echo -e 'foo\0bar'
?
Bella domanda! Forse è una cosa Posix? In bocca al lupo. – shellter
Grazie per tutte le risposte. Ho avuto lo stesso problema durante l'utilizzo di netcat per testare l'interfaccia SGCI su un server. L'intestazione SCGI ha caratteri NUL. Dopo aver letto qui, specialmente il suggerimento di usare i tubi, ho sviluppato una soluzione alternativa. Io uso l'ottale 377 (ASCII 255) dove devono essere i caratteri NUL, quindi canalizzo la stringa attraverso tr prima di collegarla a 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 –