grep -I를 사용하여 "이진 파일 일치"를 얻는 이유는 무엇입니까?

grep -I를 사용하여 "이진 파일 일치"를 얻는 이유는 무엇입니까?

아래 예에서는 동작이 이상합니다. 매뉴얼 페이지에 따르면 바이너리(예: )를 무시 하도록 되어 있는 옵션을 grep제공 하지만 여전히 "바이너리 일치" 출력이 표시됩니다.-Igrep--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을 사용하고 있습니다.

답변1

보고 있다grep 매뉴얼, 이는 다음과 같은 이유인 것 같습니다(굵은 글씨):

만약에유형without-match그때에grep은 빈 입력 바이너리 데이터를 찾습니다. 파일의 나머지 부분이 일치하지 않는다고 가정합니다. 이는 이 -I옵션과 동일합니다.

그러나 grep은 다른 데이터도 바이너리 파일을 나타낸다고 생각합니다.

텍스트가 아닌 바이트는 이진 데이터를 나타냅니다. 이는 현재 로케일에 대해 잘못 인코딩된 출력 바이트입니다.환경 변수) 또는 -z( ) 옵션이 지정되지 않은 경우 빈 입력 바이트입니다(참조--null-data다른 옵션).

따라서 다음과 같은 경우 메시지가 인쇄되지 않습니다.

  • 주어진 -I/ --binary-files=without-match옵션
  • 그리고바이너리는 널 바이트로 인해 발생합니다.

그러나 예제 입력의 경우에는 그렇지 않습니다. 샘플 파일은 null 바이트가 있기 때문이 아니라 현재 로케일(일부 UTF 로케일)에 맞지 않기 때문에 이진 파일로 간주됩니다. 그렇지 않으면:

% LC_ALL=C grep 8 test-file  
x���J�@`�y��
dIf��(��P������6u G7}S��8�0�&���'����9&�lL�Çl�t�y,蒩AU����F��cT�~
                                                                 �ʱ�k��]�Yx�$}�/����O�O�ù�4�����X��zd�Ȉ��W���,�2<�/�d�����+L
                                                                                                                            �Y�����7��PB

파일에 null 바이트를 추가하면 grep이 성공적으로 실패합니다.

% printf '\0' >> test-file
% grep -I 8 test-file    
% echo $?
1

관련 정보