¿Por qué md5sum está anteponiendo "\" delante de la suma de comprobación cuando se encuentra la suma de comprobación de un archivo con "\" en el nombre?
$ md5sum /tmp/test\\test
\d41d8cd98f00b204e9800998ecf8427e /tmp/test\\test
Lo mismo se observa para cualquier otra utilidad.
*sum
utilidades (de la misma familia quemd5sum
, e, g,sha1sum
etc.) en GNU coreutils hacen lo mismo.md5sum --version
cksum
no lo hace; por ejemplo% cksum test\\test 3915528286 4 test\test
cksum
es una utilidad POSIX y sus especificaciones. no lo permiteRespuestas:
Esto está documentado , para Coreutils '
md5sum
:( archivo es el nombre del archivo, no el contenido del archivo).
b2sum
,sha1sum
Y los diversos SHA-2 herramientas se comportan de la misma manera quemd5sum
.sum
ycksum
no lo hagas;sum
sólo se proporciona para compatibilidad hacia atrás (y sus antepasados no producen salida citado), ycksum
se especifican por POSIX y no permite que este tipo de salida.Este comportamiento se introdujo en noviembre de 2015 y se lanzó en la versión 8.25 (enero de 2016), con la siguiente
NEWS
entrada:La barra invertida al comienzo de la línea sirve como un indicador: los escapes en los nombres de archivo solo se procesan si la línea comienza con una barra invertida. (El desempañamiento no puede ser el comportamiento predeterminado: rompería las sumas generadas con versiones anteriores de Coreutils que contienen
\\
o\n
en los nombres de archivo almacenados).fuente
man
embargo, es una pena que algo completamente intuitivo como este no esté documentado en las páginas. (Y sí, estoy consciente de que GNU quiere que todos lean susinfo
páginas altamente enrevesadas )\n
etc., como literales o escapes.coreutils
contribuyente).\n
no es lo mismo que escapar de una nueva línea con una barra invertida!La respuesta de Stephen Kitt cubre el qué y trataré de cubrir por qué se implementó este cambio. Primero, alguien observó que un nombre de archivo que contenga nuevas líneas 1 podría generar un resultado ambiguo . Por ejemplo, considere esta salida:
¿Significa esto que había dos archivos
foo
ybar
, o solo un archivo cuyo nombre de archivo es"foo\n25af89c92254a806b2e93fffd8ac1814 bar"
? De acuerdo, esta última posibilidad es altamente improbable, pero es posible. Para resolver la ambigüedad, los desarrolladores optaron por escapar de las nuevas líneas con una barra diagonal inversa (\
). La salida se vuelve distinguible. Sin embargo, entonces hay otra ambigüedad:¿El nombre de este archivo contiene una nueva línea o una barra invertida seguida de un
n
? Para resolver esto, también necesitamos escapar de las barras invertidas, de modo que el último caso se convierta en:Finalmente, eligieron anteponer cada línea de salida que contiene dichos escapes con un
\\
para facilitar el analizador detecte si se ha escapado. Presumiblemente, esto se hizo para permitir que los analizadores manejen la salida tanto de versiones de escape como de versionesmd5sum
sin escape (no GNU). La bandera también significa que no es necesario hacer un escape "costoso" cuando no es necesario. Puede ver un ejemplo de este análisis en acción enmd5sum.c
sí mismo (línea 382 en la versión vinculada).1 Por nueva línea me refiero al carácter
\n
que a veces también se conoce específicamente como salto de línea o LF ; vermd5sum.c
.fuente