No exemplo a seguir, grep
se comporta de maneira estranha: é fornecido com a -I
opção, que, de acordo com a página man, deve fazer grep
ignorar arquivos binários (semelhante a --binary-files=without-match
), mas ainda recebo a saída "Correspondências de arquivos binários".
$ cat <<'EOF' | uudecode > test-file
begin 664 /dev/stdout
M>`&5SLU*Q$`0!&#/>8J^"TM/=^8/1%2\>1`\>.^9Z=D-9!))9@7?WBB^@%"G
MHOBHO+8V=2!'-WU3A9PX%*8PBB:VGK@6)Y*HFAB(.2;.;$SQPX=LNG3(>2SH
MDJE!5;R+E9P21J::8U2+?@R>RK&7:[^L&[Q=]UD6>)$D?9<O_82[Y$\&S4_,
MP[G)-)_RVN[!6(S.>F0/M\B(P]$>5[O^%_$8+/(?,CSI+]%DD;/"^^,K3`OD
,6?8=GK6MPS?WDU!"
`
end
EOF
$ grep -I 8 test-file
Binary file test-file matches
$ grep --binary-files=without-match 8 test-file
Binary file test-file matches
Aparentemente, grep
considera o arquivo binário, mas ainda tenta corresponder e relata os resultados com ele. Por que o "arquivo binário" não é ignorado conforme a -I
opção prescreve?
Estou usando o GNU grep 3.1 no Ubuntu 18.04.
Olhando para o manual do grep , isso parece ser porque (em negrito):
No entanto, o grep também considera outros dados como indicadores de arquivos binários:
Portanto, a mensagem não será impressa se:
-I
/--binary-files=without-match
são dadasNo entanto, esse não é o caso da entrada de exemplo. O arquivo de exemplo é tratado como binário porque não se ajusta à localidade atual (provavelmente alguma localidade UTF), não porque possui bytes nulos. Por outro lado:
Se eu adicionar um byte nulo ao arquivo, o grep falhará com sucesso: