md5sum命令二进制和文本模式


13

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

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

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

Answers:


11

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

是的,明确地。来自man md5sum

注意:在[sic] GNU系统上,二进制和文本模式选项之间没有区别。

这是来自md5sumGNU 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标志,bfopen()在读取文件时添加或不添加选项。在没有意义的系统上,这没有任何区别。

再说一次,我并不是说GNU的md5sum是用一种完全可移植的方式编写的,或者是从一种即衍生的方式衍生而来的,但是显然,它试图在其可操作性方面遵守一种。请注意,具有不执行任何操作的标志与不具有操作的标志并不相同-在前一种情况下,它被指定为可以,但什么也不做,而在后一种情况下,使用它可能会出错或导致未定义的行为


1
如果这些选项无用,为什么还要添加这些选项?
冻结的火焰

1
我在上面添加了一些有关此内容的段落(TL; DR->以使其对其他操作系统可能熟悉的md5sum版本的用户有所抱怨,并为此编写了批处理代码等)。
goldilocks 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.