El comando GNU md5sum
tiene dos modos:binariomodo ytextomodo. Supongo que la diferencia está únicamente en cómo se manejan los caracteres de nueva línea. ¿Estoy en lo cierto?
En GNU/Linux, los dos modos siempre producen el mismo resultado, por lo que el único uso de las opciones -b
y -t
es indicar la bandera ( *
o ) utilizada antes del nombre del archivo.
¿En qué circunstancias los modos pueden producir resultados diferentes? ¿En sistemas Windows/MacOS? (¿Versiones disponibles para estas plataformas?)
Respuesta1
En GNU/Linux, los dos modos siempre producen el mismo resultado
Sí, explícitamente. De man md5sum
:
Nota:No hay diferencia entre la opción de modo binario y texto en [sic] el sistema GNU.
Esto es de la md5sum
implementación que viene con GNU coreutils 8.21; Noto que una versión anterior (8.12) no tiene este aviso, pero supongo que ocurriría lo mismo de todos modos.
Aunque AFAICT md5sum
no está estandarizado oficialmente (por ejemplo, por POSIX), está disponible en varias plataformas en varias implementaciones y obviamente hay algún esfuerzo para que sean compatibles entre sí para facilitar su uso en todos los sistemas.
En relación a esto, elNorma ISO/ANSI CIncluye funciones de flujo de alto nivel para acceder a archivos. Como parte del estándar, están disponibles en cualquier sistema operativo que implemente ISO C a través de una biblioteca compartida o un compilador. Dado que casi todos los sistemas operativos tienen esto disponible (y generalmente están escritos en C), es una especie de lenguaje universal utilizado para implementar software potencialmente muy portátil.
Teniendo en cuenta lo que hace, sería totalmente factible escribir un archivo md5sum
que se compilara y funcionara en cualquier sistema operativo. No estoy afirmando que esto sea cierto para la versión GNU coreutils, pero una de las funciones de flujo de archivos de alto nivel mencionadas anteriormente es fopen()
, que ISO C exige que incluya un b
interruptor utilizado al abrir un archivo para indicar que se está abriendo "como binario". archivo". Lo que eso puede significar o requerir del sistemano esestipulado por el estándar, solo es necesario que exista para que pueda usarse en sistemas donde pueda haber algunos (cualquier) razón para ello.
No existe tal motivo en los sistemas operativos estilo Linux/POSIX/*nix, por lo que el conmutador no hace nada. De la especificación POSIX (un superconjunto de ISO C) paraabrir():
El carácter 'b' no tendrá ningún efecto, pero está permitido para la conformidad con el estándar ISO C.
Por lo tanto, una implementación completamente portátil md5sum
podría utilizar las funciones de flujo de archivos de alto nivel ISO, ya que no existen otros métodos para acceder a archivos en ISO C (la mayoría de las plataformas, incluidas las que cumplen con POSIX, también tienen sus propios métodos de nivel inferior, pero usarlos sería no ser portátiles porque no están en ISO C), y también debe implementar los indicadores -b
y -t
para agregar o no la b
opción fopen()
cuando lee el archivo. En sistemas donde eso no tiene sentido, no hará ninguna diferencia.
Nuevamente, no estoy diciendo que md5sum de GNU esté escrito de una manera completamente portátil o que se derive de uno que lo sea, pero obviamente está tratando de cumplir, en su operatividad, con uno que sí lo es. Tenga en cuenta que tener una bandera que no hace nada no es lo mismo que no tener la bandera; en el primer caso, se especifica que está bien pero no hace nada, mientras que en el último caso su uso podría ser un error o llevar acomportamiento indefinido.
Respuesta2
Como ya han dicho otros, en los sistemas GNU y en los Windows modernos, estas opciones no tienen ningún efecto.
Mirando el código fuente, cuando md5sum
se usa con un archivo, las opciones de texto/binario determinan si el mode
parámetro usado en fopen(const char *pathname, const char *mode)
será "r"
o "rb"
. En todos los sistemas compatibles con POSIX, b
simplemente se ignora y no tiene ningún efecto.
Cuando md5sum
se lee la entrada estándar, coreutils
el modo predeterminado será textosi y sólo si todo lo siguiente es cierto:
- la macro en tiempo de compilación
O_BINARY
está definida (es decir, hay una diferencia entre los modos texto y binario), - la entrada proviene de un terminal
- y el modo no se anula mediante una opción de línea de comandos.
De lo contrario, se asume el modo binario (a menos que lo anule la opción de línea de comandos) y, si O_BINARY
está definido, xset_binary_mode()
se llama para la entrada estándar.
xset_binary_mode()
esun contenedor definido en xbinary-io.h
of gnulib
.Si O_BINARY
no está definido, será una función ficticia que cualquier buen compilador de C optimizará; por lo tanto, de nuevo, texto versus binario no termina teniendo ningún efecto incluso si la función se llama por algún motivo.
Pero cuando O_BINARY
se defina, xset_binary_mode()
será un contenedor para set_binary_mode()
, declarado enbinary-io.h
degnulib
. A partir de aquí, encontraremos las primeras pistas sobre entornos de programación en los que el "modo binario" realmente marca la diferencia:
#if O_BINARY
# if defined __EMX__ || defined __DJGPP__ || defined __CYGWIN__
# include <io.h> /* declares setmode() */
# define __gl_setmode setmode
# else
# define __gl_setmode _setmode
# undef fileno
# define fileno _fileno
# endif
#else
/* On reasonable systems, binary I/O is the only choice. */
/* Use a function rather than a macro, to avoid gcc warnings
"warning: statement with no effect". */
BINARY_IO_INLINE int
__gl_setmode (int fd _GL_UNUSED, int mode _GL_UNUSED)
{
return O_BINARY;
}
#endif
Aparentemente, __EMX__
esEberhard Mattes eXtender, un entorno de programación en modo de 32 bits para MS-DOS y OS/2. Asimismo, __DJGPP__
se refiere a laSistema de desarrollo DJGPP de 32 bits para MS-DOS. Y luego también estáCygwin. Todos estos entornos de programación se basan en setmode()
archivos declarados en <io.h>
.
Para otros entornos de programación que definen O_BINARY
, _setmode()
se utilizará (según lo definido por el entorno de programación respectivo).
Un ejemplo de sistemas operativos donde el modo texto frente al modo binario puede ser importante sería OpenVMS. También conoce la forma estilo Unix de almacenar texto como simplemente una secuencia de caracteres. En el mundo OpenVMS, esto aparentemente se conoce como Stream_LF
formato, y el hecho de que tenga un nombre específico debería ser una pista de que esno es la única forma posible de formatear archivos de texto.
Para los curiosos:http://neilrieck.net/docs/openvms_notes_text_files.html
En resumen, en OpenVMS, el non-stream simple text
formato de archivo contiene cero o más registros (líneas) cuyo tamaño máximo está definido en los metadatos del archivo (puede ser de hasta 32767 bytes). Cada línea tiene como prefijo un valor de 16 bits que indica el número de bytes en cada línea. No existe el "carácter de fin de línea": una línea finaliza cuando se ha leído el número especificado de bytes. Si el número de bytes en una línea es impar, 0x00
se agrega un byte de relleno para que el comienzo de la siguiente línea esté en una dirección alineada con palabras. Este byte de relleno nunca se cuenta en la longitud de la línea.
GNU Coreutils ciertamente ha sidoportado a OpenVMS.
Respuesta3
Como complemento, agregaría información que en Windows md5sum
tampoco tiene diferencia en el cálculo --text
o en --binary
el modo. Probado en md5sum
(GNU coreutils) 8.31 para Windows.
c:\temp\file-fingerprint-test\work-copy1\file-fingerprint-eol (master -> origin)
2021-05-30 - 7:35:52 PM
λ xxd unix-eol.txt
00000000: 7468 6973 2066 696c 6520 6861 7320 756e this file has un
00000010: 6978 206c 696e 6520 656e 6469 6e67 730a ix line endings.
00000020: 7468 6973 206d 6561 6e20 6974 2068 6173 this mean it has
00000030: 206f 6e6c 7920 4c46 0a only LF.
c:\temp\file-fingerprint-test\work-copy1\file-fingerprint-eol (master -> origin)
2021-05-30 - 7:36:08 PM
λ xxd win-eol.txt
00000000: 7468 6973 2066 696c 6520 6861 7320 7769 this file has wi
00000010: 6e20 206c 696e 6520 656e 6469 6e67 730d n line endings.
00000020: 0a74 6869 7320 6d65 616e 2069 7420 6861 .this mean it ha
00000030: 7320 2020 4352 204c 460d 0a s CR LF..
c:\temp\file-fingerprint-test\work-copy1\file-fingerprint-eol (master -> origin)
2021-05-30 - 7:36:15 PM
λ md5sum.exe --text *.txt
c8a8c7bb97ab554cff96a76b2a8f89fa unix-eol.txt
03b3b1458cddff2cf1c15819b1255af3 win-eol.txt
c:\temp\file-fingerprint-test\work-copy1\file-fingerprint-eol (master -> origin)
2021-05-30 - 7:36:46 PM
λ md5sum.exe --bin *.txt
c8a8c7bb97ab554cff96a76b2a8f89fa *unix-eol.txt
03b3b1458cddff2cf1c15819b1255af3 *win-eol.txt
c:\temp\file-fingerprint-test\work-copy1\file-fingerprint-eol (master -> origin)
2021-05-30 - 7:36:57 PM
λ md5sum.exe --version
md5sum (GNU coreutils) 8.31
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Ulrich Drepper, Scott Miller, and David Madore.