md5sum Befehl Binär- und Textmodus

13

Der GNU - md5sumBefehl hat zwei Modi: Binär - Modus und Text - Modus. Ich denke, der Unterschied besteht nur darin, wie Zeilenumbrüche behandelt werden. Habe ich recht?

Unter GNU / Linux führen die beiden Modi immer zum gleichen Ergebnis. Die einzige Verwendung von -bund -tOptionen besteht darin, das Flag ( *oder ) anzugeben, das vor dem Dateinamen verwendet wird.

Unter welchen Umständen können die Modi unterschiedliche Ergebnisse erzielen? Auf Windows / MacOS-Systemen? (Versionen für diese Plattformen verfügbar?)

gefrorene Flamme
quelle

Antworten:

11

Unter GNU / Linux führen die beiden Modi immer zum gleichen Ergebnis

Ja, ausdrücklich. Von man md5sum:

Hinweis: Es gibt keinen Unterschied zwischen der Option für den Binär- und den Textmodus auf dem GNU-System.

Dies ist aus der md5sumImplementierung, die mit GNU Coreutils 8.21 geliefert wird; Ich stelle fest, dass eine ältere Version (8.12) diesen Hinweis nicht hat, aber ich gehe davon aus, dass dies trotzdem der Fall ist.

Obwohl AFAICT md5sumnicht offiziell standardisiert ist (z. B. von POSIX), ist es auf verschiedenen Plattformen in verschiedenen Implementierungen verfügbar, und es gibt offensichtlich einige Anstrengungen, diese für eine systemübergreifende Benutzerfreundlichkeit miteinander kompatibel zu machen.

In diesem Zusammenhang enthält der ISO / ANSI C-Standard Stream-Funktionen auf hoher Ebene für den Zugriff auf Dateien. Als Teil des Standards sind diese auf jedem Betriebssystem verfügbar, das ISO C über eine gemeinsam genutzte Bibliothek oder einen Compiler implementiert. Da dies so gut wie allen Betriebssystemen zur Verfügung steht (und selbst am häufigsten in C geschrieben sind), handelt es sich um eine Art universelle Sprache, die zur Implementierung potenziell sehr portabler Software verwendet wird.

In Anbetracht dessen, was es tut, wäre es völlig machbar, ein Programm zu schreiben md5sum, das auf jedem Betriebssystem kompiliert und funktioniert. Ich behaupte nicht, dass dies für die GNU-Coreutils-Version zutrifft, aber eine der zuvor erwähnten High-Level-Dateistream-Funktionen ist fopen(), dass ISO C einen bSchalter zum Öffnen einer Datei einschließt, um anzuzeigen, dass sie als Binärdatei geöffnet wird Datei". Was dies für das System bedeuten oder erfordern kann, ist nicht durch den Standard festgelegt, sondern muss nur vorhanden sein, damit es auf einem System verwendet werden kann, für das möglicherweise ein ( beliebiger ) Grund vorliegt .

Unter Linux / POSIX / * nix-ähnlichen Betriebssystemen gibt es keinen solchen Grund, sodass der Switch nichts unternimmt. Aus der POSIX-Spezifikation (eine Obermenge von ISO C) für fopen () :

Das Zeichen 'b' hat keine Wirkung, ist jedoch für die Einhaltung der ISO C-Norm zulässig.

Eine vollständig portable md5sumImplementierung kann daher die ISO-High-Level-Dateistream-Funktionen verwenden, da es keine anderen Methoden für den Zugriff auf Dateien in ISO C gibt (die meisten Plattformen, einschließlich der POSIX-Beschwerdeplattformen, haben auch ihre eigenen Methoden auf niedrigerer Ebene, verwenden diese jedoch nicht portierbar sein, da sie nicht in ISO C) sind, und es sollte auch die Flags -bund implementieren, -tum die bOption hinzuzufügen oder nicht hinzuzufügen , fopen()wenn die Datei gelesen wird. Auf Systemen, auf denen dies bedeutungslos ist, macht es keinen Unterschied.

Wiederum sage ich nicht, dass die md5sum von GNU so portabel geschrieben oder von einer abgeleiteten abgeleitet ist, aber offensichtlich versucht sie, in ihrer Funktionsfähigkeit einer solchen zu entsprechen. Beachten Sie, dass ein Flag, das nichts tut, nicht dasselbe ist wie das Fehlen eines Flags. Im ersteren Fall wird angegeben, dass es in Ordnung ist, aber nichts zu tun, während im späteren Fall die Verwendung ein Flag sein oder zu undefiniertem Verhalten führen kann .

Goldlöckchen
quelle
1
Warum werden diese Optionen hinzugefügt, wenn sie unbrauchbar sind?
Gefrorene Flamme
1
Ich habe oben einige Absätze dazu hinzugefügt (TL; DR ->, um sich über Versionen von md5sum zu beschweren, mit denen Benutzer möglicherweise von anderen Betriebssystemen vertraut sind, und Batch-Code usw., der für solche geschrieben wurde).
Goldlöckchen