次の例では、動作は奇妙です。マニュアルページでは、バイナリ(例:)を無視するオプションがあります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を使用しています。
ベストアンサー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
ファイルにヌルバイトを追加すると、grepは正常に失敗します。
% printf '\0' >> test-file
% grep -I 8 test-file
% echo $?
1