La réponse de Stephen Kitt couvre le quoi et j'essaierai de comprendre pourquoi ce changement a été mis en œuvre. Tout d'abord, quelqu'un a observé qu'un nom de fichier contenant des sauts de ligne 1 pouvait entraîner une sortie ambiguë . Par exemple, considérez cette sortie:
d41d8cd98f00b204e9800998ecf8427e foo
25af89c92254a806b2e93fffd8ac1814 bar
Est-ce à dire qu'il y avait deux fichiers foo
et / bar
ou un seul fichier dont le nom est "foo\n25af89c92254a806b2e93fffd8ac1814 bar"
? Certes, cette dernière possibilité est hautement improbable, mais elle est possible. Pour résoudre l'ambiguïté, les développeurs ont choisi d'échapper aux nouvelles lignes avec une barre oblique inverse ( \
). La sortie devient alors reconnaissable. Cependant, il y a encore une ambiguïté:
764efa883dda1e11db47671c4a3bbd9e foo\nbar
Le nom de ce fichier contient-il une nouvelle ligne ou une barre oblique inverse suivie d'un n
? Pour résoudre ce problème, nous devons également échapper aux barres obliques inverses, afin que ce dernier cas devienne:
764efa883dda1e11db47671c4a3bbd9e foo\\nbar
Enfin, ils ont choisi de faire précéder chaque ligne de sortie qui contient ces échappements d'un \\
afin de permettre à un analyseur de détecter facilement si l'échappement a été effectué. Vraisemblablement, cela a été fait pour permettre aux analyseurs de gérer la sortie à la fois des versions d'échappement md5sum
et des versions non d'échappement (non GNU). Le drapeau signifie également qu'il n'est pas nécessaire de procéder à un échappement «coûteux» lorsqu'il n'est pas nécessaire. Vous pouvez voir un exemple de cette analyse en action en md5sum.c
soi (ligne 382 dans la version liée).
1 Par saut de ligne, j'entends le caractère \n
qui est parfois aussi spécifiquement appelé saut de ligne ou LF ; voir md5sum.c
.
*sum
utilitaires (de la même famille quemd5sum
, e, g,sha1sum
etc.) dans GNU coreutils font de même.