md5sum 命令二进制和文本模式

fro*_*ame 17 hashsum binary text

GNUmd5sum命令有两种模式:二进制模式和文本模式。我想区别仅在于如何处理换行符?我对吗?

在 GNU/Linux 上,这两种模式总是产生相同的结果,所以-b-t选项的唯一用途是指示在文件名之前使用的标志(*)?

在什么情况下模式会产生不同的结果?在 Windows/MacOS 系统上?(这些平台的版本可用吗?)

gol*_*cks 12

在 GNU/Linux 上,这两种模式总是产生相同的结果

是的,明确的。来自man md5sum

注意: [原文如此] GNU 系统上的二进制和文本模式选项没有区别。

这是来自md5sumGNU coreutils 8.21 附带的实现;我注意到旧版本 (8.12) 没有此通知,但我认为无论如何都是如此。

尽管 AFAICTmd5sum没有正式标准化(例如,通过 POSIX),但它在各种实现的各种平台上都可用,并且显然有一些努力使它们相互兼容以便于跨系统使用。

与此相关,ISO/ANSI C 标准包括用于访问文件的高级流函数。作为标准的一部分,它们可用于通过共享库或编译器实现 ISO C 的任何操作系统。由于几乎所有操作系统都可以使用它(并且它们本身通常是用 C 编写的),因此它是一种用于实现可能非常便携的软件的通用语言。

考虑到它的作用,编写一个md5sum可以在任何操作系统上编译和工作的程序是完全可行的。我并不是说 GNU coreutils 版本是这样,但前面提到的高级文件流函数之一是fopen(),ISO C 要求它包含一个b用于打开文件的开关,以表明它正在“作为二进制文件打开”文件”。标准没有规定系统的含义或要求,它只是要求存在,以便它可以在可能有一些(任何)原因的系统上使用。

在 linux/POSIX/*nix 风格的操作系统上没有这样的原因,所以开关什么也不做。来自fopen()的 POSIX 规范(ISO C 的超集

字符“b”无效,但允许符合 ISO C 标准。

因此,完全可移植的md5sum实现可能会使用 ISO 高级文件流函数,因为没有其他方法可以访问 ISO C 中的文件(大多数平台,包括 POSIX 投诉平台,也有自己的低级方法,但使用这些会不可移植,因为它们不在 ISO C 中),并且它还应该实现-b-t标志bfopen()在读取文件时添加或不添加选项。在没有意义的系统上,它不会有任何区别。

再说一次,我并不是说 GNU 的 md5sum 是以一种完全可移植的方式编写的,也不是说源自一种完全可移植的方式,但显然它试图在其可操作性方面遵守可移植性。请注意,有一个什么都不做的标志与没有这个标志是不一样的——在前一种情况下,它被指定为可以但什么都不做,而在后一种情况下,使用它可能是一个错误或导致未定义的行为.

  • 如果这些选项没有用,为什么还要添加呢? (2认同)
  • 我在上面添加了一些关于此的段落(TL;DR -> 以使其适应其他操作系统中用户可能熟悉的 md5sum 版本,以及为此编写的批处理代码等)。 (2认同)