在下面的示例中,grep
行为奇怪:它提供了-I
选项,根据手册页,它应该grep
忽略二进制文件(类似于--binary-files=without-match
),但我仍然得到“二进制文件匹配”输出。
$ 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
显然,grep
考虑文件二进制,但仍然尝试匹配并报告结果。为什么-I
选项规定的“二进制文件”没有被忽略?
我在 Ubuntu 18.04 上使用 GNU grep 3.1。
查看grep 手册,这似乎是因为(我的粗体):
但是,grep 也将其他数据视为指示二进制文件:
因此,如果出现以下情况,则不会打印该消息:
-I
/--binary-files=without-match
选项但是,示例输入并非如此。示例文件被视为二进制文件,因为它不适合当前的语言环境(可能是某些 UTF 语言环境),而不是因为它具有空字节。否则:
如果我在文件中添加一个空字节,grep 会成功失败: