Pourquoi md5sum ajoute-t-il "\" devant la somme de contrôle lors de la recherche de la somme de contrôle d'un fichier avec "\" dans le nom?
$ md5sum /tmp/test\\test
\d41d8cd98f00b204e9800998ecf8427e /tmp/test\\test
La même chose est notée pour tous les autres utilitaires.
*sum
utilitaires (de la même famille quemd5sum
, e, g,sha1sum
etc.) dans GNU coreutils font de même.md5sum --version
cksum
ne fonctionne pas; par exemple% cksum test\\test 3915528286 4 test\test
cksum
s'agit d'un utilitaire POSIX et de ses spécifications. ne le permet pas.Réponses:
Ceci est documenté , pour Coreutils
md5sum
:(le fichier est le nom du fichier, pas le contenu du fichier).
b2sum
,sha1sum
Et les différents outils SHA-2 se comportent de la même manière quemd5sum
.sum
etcksum
ne le faites pas;sum
est uniquement fourni pour la compatibilité descendante (et ses ancêtres ne produisent pas de sortie entre guillemets), etcksum
est spécifié par POSIX et n'autorise pas ce type de sortie.Ce comportement a été introduit en novembre 2015 et publié dans la version 8.25 (janvier 2016), avec l'
NEWS
entrée suivante :La barre oblique inverse au début de la ligne sert d'indicateur: les échappements dans les noms de fichiers ne sont traités que si la ligne commence par une barre oblique inverse. (Unescaping ne peut pas être le comportement par défaut: il casserait les sommes générées avec les anciennes versions de Coreutils contenant
\\
ou\n
dans les noms de fichiers stockés.)la source
man
pages. (Et oui, je suis conscient que GNU veut que tout le monde liseinfo
plutôt leurs pages très compliquées .)\n
etc. comme des littéraux ou des échappements.coreutils
contributeur).\n
n'est pas la même chose qu'échapper une nouvelle ligne avec une barre oblique inverse!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:
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é: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: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'échappementmd5sum
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 enmd5sum.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 ; voirmd5sum.c
.la source