fro*_*ame 17 hashsum binary text
GNUmd5sum
命令有两种模式:二进制模式和文本模式。我想区别仅在于如何处理换行符?我对吗?
在 GNU/Linux 上,这两种模式总是产生相同的结果,所以-b
和-t
选项的唯一用途是指示在文件名之前使用的标志(*
或)?
在什么情况下模式会产生不同的结果?在 Windows/MacOS 系统上?(这些平台的版本可用吗?)
gol*_*cks 12
在 GNU/Linux 上,这两种模式总是产生相同的结果
是的,明确的。来自man md5sum
:
注意: [原文如此] GNU 系统上的二进制和文本模式选项没有区别。
这是来自md5sum
GNU 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
标志b
以fopen()
在读取文件时添加或不添加选项。在没有意义的系统上,它不会有任何区别。
再说一次,我并不是说 GNU 的 md5sum 是以一种完全可移植的方式编写的,也不是说源自一种完全可移植的方式,但显然它试图在其可操作性方面遵守可移植性。请注意,有一个什么都不做的标志与没有这个标志是不一样的——在前一种情况下,它被指定为可以但什么都不做,而在后一种情况下,使用它可能是一个错误或导致未定义的行为.