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 foo
und 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 md5sum
als 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, \n
das manchmal auch speziell als Zeilenvorschub oder LF bezeichnet wird ; sehen md5sum.c
.
*sum
tun die anderen Dienstprogramme (derselben Familie wiemd5sum
z. B.sha1sum
usw.) in GNU coreutils dasselbe.