Por que md5sum está precedendo "\" 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.
Isso está documentado , para Coreutils'
md5sum
:( arquivo é o nome do arquivo, não o conteúdo do arquivo).
b2sum
,sha1sum
, e as várias ferramentas SHA-2 se comportam da mesma maneira quemd5sum
.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: os escapes em nomes de arquivos são processados apenas se a linha começar com uma barra invertida. (O comportamento sem escape não pode ser o padrão: isso quebraria as somas geradas com versões mais antigas do Coreutils contendo
\\
ou\n
nos nomes de arquivo armazenados.)A resposta de Stephen Kitt cobre o quê e tentarei explicar 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"
? Concedido, esta última possibilidade é altamente improvável, mas é possível. Para resolver a ambigüidade, os desenvolvedores optaram por escapar das novas linhas com uma barra invertida (\
). A saída torna-se então 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 das barras invertidas também, para que o último caso se torne:Finalmente, eles optaram por preceder cada linha de saída que contém tais escapes com um
\\
para tornar mais fácil para um analisador detectar se o escape foi feito. Presumivelmente, isso foi feito para permitir que os analisadores manipulem a saída de versões com escapemd5sum
e sem escape (não-GNU). O sinalizador também significa que o cancelamento de escape "caro" não precisa ser feito quando não for necessário. 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 é especificamente referido como avanço de linha ou LF ; vermd5sum.c
.