A resposta de Stephen Kitt cobre o quê e tentarei abordar por que essa mudança foi implementada. Primeiro, alguém observou que um nome de arquivo contendo novas linhas 1 poderia resultar em uma saída ambígua . Por exemplo, considere esta saída:
d41d8cd98f00b204e9800998ecf8427e foo
25af89c92254a806b2e93fffd8ac1814 bar
Isso significa que havia dois arquivos foo
e bar
, ou apenas um arquivo cujo nome de arquivo é "foo\n25af89c92254a806b2e93fffd8ac1814 bar"
? É verdade que essa última possibilidade é altamente improvável, mas é possível. Para resolver a ambiguidade, os desenvolvedores optaram por escapar de novas linhas com uma barra invertida ( \
). A saída então se torna distinguível. No entanto, há uma outra ambiguidade:
764efa883dda1e11db47671c4a3bbd9e foo\nbar
O nome deste arquivo contém uma nova linha ou uma barra invertida seguida por um n
? Para resolver isso, precisamos escapar de barras invertidas também, para que o último caso se torne:
764efa883dda1e11db47671c4a3bbd9e foo\\nbar
Finalmente, eles optaram por anexar previamente cada linha de saída que contém esses escapes com a \\
para facilitar a análise de um analisador se o escape foi realizado. Presumivelmente, isso foi feito para permitir que os analisadores manipulem a saída das versões de escape md5sum
e de versões não escapantes (não GNU). A bandeira também significa que a fuga "dispendiosa" não precisa ser feita quando não é necessária. Você pode ver um exemplo dessa análise em ação em md5sum.c
si (linha 382 na versão vinculada).
1 Por nova linha, quero dizer o caractere \n
que às vezes também é chamado de avanço de linha ou LF ; veja md5sum.c
.
*sum
utilitários (da mesma família quemd5sum
, e, g,sha1sum
etc.) nos coreutils do GNU fazem o mesmo.