Pourquoi MD5Sum est-il préparé "\" 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
Il en va de même pour chaque autre utilité.
Ceci est documenté , pour Coreutils 'md5sum
:
Si Fichier contient une barre oblique inverse ou une nouvelle ligne, la ligne est démarrée avec une barre oblique inverse et chaque caractère problématique du nom de fichier est échappé avec une barre oblique inverse, en faisant le production sans ambiguïté même en présence de noms de fichiers arbitraires.
( Fichier est le nom de fichier, pas le contenu du fichier).
b2sum
, sha1sum
et les divers outils SHA-2 se comporter de la même manière que md5sum
. sum
et cksum
Pas; sum
_ est uniquement prévu pour la compatibilité à l'envers (et ses ancêtres ne produisent pas une sortie citée), et cksum
est spécifié par POSIX et ne permet pas ce type de la sortie.
Ce comportement était introduit en novembre 2015 et publié dans la version 8.25 (janvier 2016), avec l'entrée suivante NEWS
:
md5sum
assure maintenant une seule ligne par fichier pour statut sur la sortie standard, en utilisant un "\ 'au début de la ligne et en remplaçant les nouvelles lignes avec"\n ". Cela affecte égalementsha1sum
,sha224sum
,sha256sum
,sha384sum
etsha512sum
.
La barre oblique inverse au début de la ligne sert de drapeau: les évasions des noms de fichiers ne sont traitées que si la ligne commence avec une barre oblique inverse. (Unescaping ne peut pas être le comportement par défaut: il briserait des sommes générées par des versions plus anciennes de Coreutils contenant \\
ou \n
Dans les noms de fichiers stockés.)
La réponse de Stephen Kitt couvre le quoi et je vais essayer de couvrir pourquoi Le changement a été mis en œuvre. Tout d'abord, quelqu'un a observé qu'un nom de fichier contenant de nouvelles lignes1 pourrait entraîner une sortie ambiguë . Par exemple, considérez cette sortie:
d41d8cd98f00b204e9800998ecf8427e foo
25af89c92254a806b2e93fffd8ac1814 bar
Cela signifie-t-il qu'il y avait deux fichiers foo
et bar
ou un seul fichier dont le nom de fichier est "foo\n25af89c92254a806b2e93fffd8ac1814 bar"
? Certes, cette dernière possibilité est très improbable, mais c'est possible. Pour résoudre l'ambiguïté, les développeurs ont choisi d'échapper à de nouvelles lignes avec une barre oblique inverse (\
). La sortie devient alors distinguée. Cependant, il y a une autre 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 aussi échapper aux backslashes, afin que ce dernier cas devienne:
764efa883dda1e11db47671c4a3bbd9e foo\\nbar
Enfin, ils ont choisi de préparer chaque ligne de sortie qui contient de telles échappées avec un \\
Pour faciliter l'analyse d'un analyseur de détecter si l'échappement a été effectué. Cela a probablement été fait pour permettre aux analyseurs de gérer la production à partir de versions de l'échappement de md5sum
et à partir de versions non échappées (non-GNU). Le drapeau signifie également que "coûteux" non-échappement n'a pas besoin d'être fait lorsqu'il n'est pas nécessaire. Vous pouvez voir un exemple de cette analyse d'action dans md5sum.c
lui-même (ligne 382 dans la version liée).
1 Par Newline Je veux dire le caractère \n
qui est parfois aussi désigné spécifiquement comme un ligne de ligne ou [~ # ~ # ~ # ~ ] ; voir md5sum.c
.