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:
d41d8cd98f00b204e9800998ecf8427e foo
25af89c92254a806b2e93fffd8ac1814 bar
¿Significa esto que había dos archivos foo
y bar
, 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:
764efa883dda1e11db47671c4a3bbd9e foo\nbar
¿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:
764efa883dda1e11db47671c4a3bbd9e foo\\nbar
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 versiones md5sum
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 en md5sum.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
.
*sum
utilidades (de la misma familia quemd5sum
, e, g,sha1sum
etc.) en GNU coreutils hacen lo mismo.