Answers:
在GNU / Linux上,两种模式总是产生相同的结果
是的,明确地。来自man md5sum
:
注意:在[sic] GNU系统上,二进制和文本模式选项之间没有区别。
这是来自md5sum
GNU coreutils 8.21附带的实现。我注意到较旧的版本(8.12)没有此通知,但我想无论如何也是如此。
尽管AFAICT md5sum
尚未正式标准化(例如,通过POSIX),但可以在各种实现中的各种平台上使用它,并且显然已经在努力使它们彼此兼容,以便在整个系统中轻松使用。
与此相关的是,ISO / ANSI C标准包括用于访问文件的高级流功能。作为标准的一部分,它们可在通过共享库或编译器实现ISO C的任何操作系统上使用。由于几乎所有的操作系统都具有可用的功能(并且它们本身通常是用C编写的),因此它是一种通用语言,用于实现潜在的非常可移植的软件。
考虑到它的作用,编写一个md5sum
可以在任何操作系统上运行的编译器是完全可行的。我并不是说这对GNU coreutils版本是正确的,但是前面提到的高级文件流功能之一是fopen()
,它由ISO C强制要求包含一个b
用于打开文件的开关,以表明它正在“以二进制形式打开”。文件”。该标准未对系统的含义或要求进行规定,只是要求它存在才能将其用于可能有某些(任何)原因的系统上。
在linux / POSIX / * nix风格的操作系统上没有这种原因,因此该开关不执行任何操作。从POSIX规范(ISO C的超集)中获取fopen():
字符“ b”无效,但允许符合ISO C标准。
因此,完全可移植的md5sum
实现可能会使用ISO高级文件流功能,因为没有其他方法可以访问ISO C中的文件(大多数平台,包括POSIX投诉平台,也都有其自己的较低层方法,但是使用这些方法会不可移植,因为它们不在ISO C中),并且还应实现-b
和-t
标志,b
以fopen()
在读取文件时添加或不添加选项。在没有意义的系统上,这没有任何区别。
再说一次,我并不是说GNU的md5sum是用一种完全可移植的方式编写的,或者是从一种即衍生的方式衍生而来的,但是显然,它试图在其可操作性方面遵守一种。请注意,具有不执行任何操作的标志与不具有操作的标志并不相同-在前一种情况下,它被指定为可以,但什么也不做,而在后一种情况下,使用它可能会出错或导致未定义的行为。