Por que o md5sum está anexando "\" na frente da soma de verificação ao localizar a soma de verificação de um arquivo com "\" no nome?
$ md5sum /tmp/test\\test
\d41d8cd98f00b204e9800998ecf8427e /tmp/test\\test
O mesmo é observado para todos os outros utilitários.
*sum
utilitários (da mesma família quemd5sum
, e, g,sha1sum
etc.) nos coreutils do GNU fazem o mesmo.md5sum --version
cksum
não; por exemplo,% cksum test\\test 3915528286 4 test\test
cksum
é um utilitário POSIX e suas especificações. não permite isso.Respostas:
Isso está documentado , para o Coreutils
md5sum
:( arquivo é o nome do arquivo, não o conteúdo do arquivo).
b2sum
,sha1sum
E as várias ferramentas de SHA-2 se comportam da mesma formamd5sum
.sum
ecksum
não;sum
é fornecido apenas para compatibilidade com versões anteriores (e seus ancestrais não produzem saída entre aspas) ecksum
é especificado pelo POSIX e não permite esse tipo de saída.Esse comportamento foi introduzido em novembro de 2015 e lançado na versão 8.25 (janeiro de 2016), com a seguinte
NEWS
entrada:A barra invertida no início da linha serve como um sinalizador: escapes nos nomes de arquivos são processados apenas se a linha começar com uma barra invertida. (Desescanear não pode ser o comportamento padrão: ele quebraria as somas geradas com versões mais antigas do Coreutils que continham
\\
ou\n
nos nomes de arquivos armazenados.)fonte
man
páginas. (E sim, eu estou ciente GNU quer todos poderão ler seus altamente complicadasinfo
páginas em seu lugar.)\n
etc. como literais ou escapes.coreutils
colaborador).\n
não é o mesmo que escapar de uma nova linha com uma barra invertida!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:
Isso significa que havia dois arquivos
foo
ebar
, 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: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: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 escapemd5sum
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 emmd5sum.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 ; vejamd5sum.c
.fonte