Il s'agit de traductions incorrectes, <newline> indique un caractère bien précis, le caractère de fin de ligne, ayant pour code ASCII 10, c'est à dire "LF", "linefeed", "\n" ou "Control-J".
Les spécifications officielles de "wc" indiquent:
The wc utility shall read one or more input files and, by default, write the number of <newline> characters, words, and bytes contained in each input file to the standard output.
La norme POSIX n'impose pas aux utilitaires de considérer une dernière ligne incomplète comme valide. Plus précisément, les commandes prévues pour traiter des "fichiers texte" (text files) n'ont pas leur comportement nécessairement spécifié si on leur demande de traiter un fichier binaire. Or, un fichier qui n'est pas terminé par un <newline> est un fichier binaire suivant la définition de POSIX. cf http://pubs.opengroup.org/onlinepubs...ag_01_03_00_65
Suivant les implémentations, on pourra donc observer des comportement différents.
Par exemple ici sous Solaris 11 où les commandes GNU sont dans /usr/gnu/bin et les commandes strictement POSIX dans /usr/xpg4/bin :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| $ od -c /tmp/x
0000000 # ! / b i n / b a s h \n d a t e
0000020
$ /usr/gnu/bin/wc -l /tmp/x
1 /tmp/x
$ grep date /tmp/x
date$ # ici l'absence de newline a été préservée par le grep de Solaris.
$ /usr/gnu/bin/grep date /tmp/x
date # un <newline> est ajouté par GNU grep et POSIX grep
$ /usr/xpg4/bin/grep date /tmp/x
date
$ sed 's/date/toto/' /tmp/x
#!/bin/bash # la ligne incomplète est perdue avec le sed de Solaris.
$ /usr/gnu/bin/sed 's/date/toto/' /tmp/x
#!/bin/bash
toto$ # le sed GNU préserve l'absence de <newline>
$ /usr/xpg4/bin/sed 's/date/toto/' /tmp/x
#!/bin/bash
sed: Missing newline at end of file /tmp/x. # le sed POSIX affiche un message sur stderr et ajoute le <newline> qui manquait à la fin du fichier
toto
$ |
Partager