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 fooe 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 md5sumsenza 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 \nche a volte viene anche specificamente indicato come avanzamento di riga o LF ; vedi md5sum.c.
*sumutility (della stessa famiglia dimd5sum, e, g,sha1sumecc.) Nei coreutils GNU fanno lo stesso.