Stephen Kitts Antwort behandelt das, was und ich werde versuchen zu erklären, warum diese Änderung umgesetzt wurde. Zunächst stellte jemand fest, dass ein Dateiname mit Zeilenumbrüchen 1 zu mehrdeutigen Ausgaben führen kann . Betrachten Sie beispielsweise diese Ausgabe:
d41d8cd98f00b204e9800998ecf8427e foo
25af89c92254a806b2e93fffd8ac1814 bar
Bedeutet dies, dass zwei Dateien vorhanden waren foound bar/ oder nur eine Datei mit dem Dateinamen "foo\n25af89c92254a806b2e93fffd8ac1814 bar"? Zugegeben, letztere Möglichkeit ist höchst unwahrscheinlich, aber möglich. Um die Mehrdeutigkeit zu beseitigen, haben sich die Entwickler dafür entschieden, Zeilenumbrüche mit einem Backslash ( \) zu umgehen . Die Ausgabe wird dann unterscheidbar. Dann gibt es jedoch eine weitere Mehrdeutigkeit:
764efa883dda1e11db47671c4a3bbd9e foo\nbar
Enthält der Name dieser Datei einen Zeilenumbruch oder einen umgekehrten Schrägstrich, gefolgt von einem n ? Um dies zu beheben, müssen wir auch Backslashes vermeiden, damit der letztere Fall wie folgt lautet:
764efa883dda1e11db47671c4a3bbd9e foo\\nbar
Schließlich haben sie sich dafür entschieden, jeder Ausgabezeile, die solche Escape-Zeichen enthält, ein voranzustellen \\, damit ein Parser leicht erkennen kann, ob ein Escape-Zeichen ausgeführt wurde. Vermutlich wurde dies getan, um Parsern zu ermöglichen, die Ausgabe sowohl von Escape-Versionen md5sumals auch von Nicht-Escape-Versionen (Nicht-GNU) zu verarbeiten. Die Flagge bedeutet auch, dass "kostspieliges" Nicht-Entkommen nicht durchgeführt werden muss, wenn es nicht notwendig ist. Sie können ein Beispiel für dieses Parsing in Aktion in sehenmd5sum.c sich sehen (Zeile 382 in der verknüpften Version).
1 Mit Zeilenumbruch meine ich das Zeichen, \ndas manchmal auch speziell als Zeilenvorschub oder LF bezeichnet wird ; sehen md5sum.c.
*sumtun die anderen Dienstprogramme (derselben Familie wiemd5sumz. B.sha1sumusw.) in GNU coreutils dasselbe.