La risposta di Stephen Kitt copre cosa e cercherò di capire perché questo cambiamento è stato implementato. In primo luogo, qualcuno ha osservato che un nome file contenente newline 1 potrebbe generare risultati ambigui . Ad esempio, considera questo output:
d41d8cd98f00b204e9800998ecf8427e foo
25af89c92254a806b2e93fffd8ac1814 bar
Questo significa che c'erano due file foo
e bar
, o solo un file il cui nome file è "foo\n25af89c92254a806b2e93fffd8ac1814 bar"
? Certo, quest'ultima possibilità è altamente improbabile, ma è possibile. Per risolvere l'ambiguità gli sviluppatori hanno scelto di sfuggire a nuove righe con una barra rovesciata ( \
). L'output diventa quindi distinguibile. Tuttavia, allora c'è un'ulteriore ambiguità:
764efa883dda1e11db47671c4a3bbd9e foo\nbar
Il nome di questo file contiene una nuova riga o una barra rovesciata seguita da un n
? Per risolvere questo, dobbiamo evitare anche le barre rovesciate, in modo che quest'ultimo caso diventi:
764efa883dda1e11db47671c4a3bbd9e foo\\nbar
Alla fine, hanno scelto di anteporre ogni riga di output che contiene tali escape con a \\
per rendere più semplice per un parser rilevare se l'escaping è stato eseguito. Presumibilmente, ciò è stato fatto per consentire ai parser di gestire l'output sia da versioni con escape che da versioni md5sum
senza escape (non GNU). La bandiera significa anche che non è necessario effettuare la fuga "costosa" quando non è necessario. Puoi vedere un esempio di questa analisi in azione md5sum.c
(riga 382 nella versione collegata).
1 Per newline intendo il personaggio \n
che a volte viene anche specificamente indicato come avanzamento di riga o LF ; vedi md5sum.c
.
*sum
utility (della stessa famiglia dimd5sum
, e, g,sha1sum
ecc.) Nei coreutils GNU fanno lo stesso.