2016-11-24 3 views
0

bash GNU version 4.3.42 (1) -releasecoupé le caractère Utilisation d'intérieur variable null

Essayer de DÉliminer sur un caractère nul, mais bash ne semble pas garder le caractère nul dans une variable .

$ echo -e 'hello\0goodbye' > testlist 
$ cat testlist | cut -d '' -f1 
hello 
$ foobar=$(echo -e 'hello\0goodbye'); echo "$foobar" | cut -d '' -f1 
hellogoodbye 

Y at-il quelque chose que je fais mal?

+0

Pourquoi pensez-vous que '''' est le caractère nul? –

+1

@Miati, oui. Selon mon expérience, shell ne peut pas contenir un caractère nul dans une variable. Les autres commandes telles que 'find' et' xargs' n'ont aucun problème. Cependant, shell peut même gérer le caractère nul en tant que partie d'une chaîne, comme vous pouvez le voir dans la sortie de cette ligne de commande: 'echo -e 'A \ 0B' | od -tx1' – Jdamian

+2

@Miati, je suppose que bash ne peut pas conserver le caractère nul dans une variable car il est utilisé comme caractère de délimiteur de fin de chaîne dans C. – Jdamian

Répondre

1

Bash ne Noyez le zéro binaire:

echo -e 'hello\0goodbye' | od -xc 

donne:

0000000  6568 6c6c 006f 6f67 646f 7962 0a65   
     h e l l o \0 g o o d b y e \n 

bien que personnellement je préfère la notation \x00.

C'est le programme cut qui est le problème. Vous pouvez donc utiliser la langue awk à la place. Par exemple:

awk -F '\0' '{print $1}' testlist 

(note: pas cat obligatoire) et:

foobar='hello\0goodbye' 
echo -e "$foobar" | awk -F '\0' '{print $1}' 

les deux donnent:

hello 

Cependant, \0 est dilatée à une chaîne vide (comme indiqué dans man bash) donc

foobar=$(echo -e 'hello\0goodbye') 

perd le null, comme vous avez trouvé.