El GNU md5sum
El comando tiene dos modos:binario modo y texto modo. Supongo que la diferencia está solo en cómo se manejan los caracteres de nueva línea. ¿Tengo razón?
En GNU/Linux, los dos modos siempre producen el mismo resultado, por lo que el único uso de -b
y -t
opciones es indicar la bandera (*
o ) usado antes del nombre del archivo?
¿En qué circunstancias los modos pueden producir resultados diferentes? ¿En sistemas Windows/MacOS? (¿Versiones para estas plataformas disponibles?)
Respuesta aceptada:
En GNU/Linux, los dos modos siempre producen el mismo resultado
Sí, explícitamente. De man md5sum
:
Esto es del md5sum
implementación que se envía con GNU coreutils 8.21; Noté que una versión anterior (8.12) no tiene este aviso, pero supongo que lo mismo sería cierto de todos modos.
Aunque AFAICT md5sum
no está oficialmente estandarizado (p. ej., 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 con esto, el estándar ISO/ANSI C incluye 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 que se usa para implementar software potencialmente muy portátil.
Teniendo en cuenta lo que hace, sería totalmente factible escribir un md5sum
que compilaría y trabajaría 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 está obligado por ISO C a incluir un b
interruptor utilizado al abrir un archivo para indicar que se está abriendo "como archivo binario". Lo que eso puede significar o requerir del sistema no lo es estipulado por el estándar, solo se requiere que exista para que pueda usarse en el sistema donde puede haber algunos (cualquier ) razón para ello.
No existe tal razón en los sistemas operativos de estilo linux/POSIX/*nix, por lo que el interruptor no hace nada. De la especificación POSIX (un superconjunto de ISO C) para fopen():
El carácter 'b' no tendrá ningún efecto, pero está permitido para la conformidad con la norma ISO C.
Entonces, un md5sum
completamente portátil La implementación podría usar las funciones de flujo de archivos de alto nivel ISO, ya que no hay otros métodos para acceder a los archivos en ISO C (la mayoría de las plataformas, incluidas las de quejas de POSIX, también tienen sus propios métodos de nivel inferior, pero usarlos no sería portátil porque no están en ISO C), y también debería implementar -b
y -t
banderas para agregar o no agregar el b
opción a fopen()
cuando lee el archivo. En los sistemas donde eso no tiene sentido, no hará ninguna diferencia.
Una vez más, no estoy diciendo que md5sum de GNU esté escrito de una manera tan completamente portátil o derivado de uno que lo sea, pero obviamente está tratando de cumplir, en su operatividad, con uno que lo sea. 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 conducir a un comportamiento indefinido.