GNU grep 2.24 RTFS
Kesimpulan: 2 dan 2 hanya kasus:
NUL
misalnya printf 'a\0' | grep 'a'
kesalahan penyandian menurut C99 mbrlen()
, mis:
export LC_CTYPE='en_US.UTF-8'
printf 'a\x80' | grep 'a'
karena \x80
tidak bisa menjadi byte pertama dari titik Unicode UTF-8 : UTF-8 - Keterangan | en.wikipedia.org
Selanjutnya, seperti yang disebutkan oleh Stéphane Chazelas Apa yang membuat grep menganggap file sebagai biner? | Unix & Linux Stack Exchange , pemeriksaan tersebut hanya dilakukan hingga membaca buffer pertama dengan panjang TODO.
Hanya sampai buffer pertama dibaca
Jadi, jika NUL atau kesalahan pengodean terjadi di tengah file yang sangat besar, itu mungkin akan diterima.
Saya membayangkan ini untuk alasan kinerja.
Misalnya: ini mencetak baris:
printf '%10000000s\n\x80a' | grep 'a'
tetapi ini tidak:
printf '%10s\n\x80a' | grep 'a'
Ukuran buffer aktual tergantung pada bagaimana file dibaca. Misalnya bandingkan:
export LC_CTYPE='en_US.UTF-8'
(printf '\n\x80a') | grep 'a'
(printf '\n'; sleep 1; printf '\x80a') | grep 'a'
Dengan sleep
, baris pertama diteruskan ke grep walaupun panjangnya hanya 1 byte karena prosesnya tertidur, dan pembacaan kedua tidak memeriksa apakah file tersebut biner.
RTFS
git clone git://git.savannah.gnu.org/grep.git
cd grep
git checkout v2.24
Temukan di mana pesan kesalahan stderr dikodekan:
git grep 'Binary file'
Arahkan kami ke /src/grep.c
:
if (!out_quiet && (encoding_error_output
|| (0 <= nlines_first_null && nlines_first_null < nlines)))
{
printf (_("Binary file %s matches\n"), filename);
Jika variabel-variabel tersebut dinamai dengan baik, kami pada dasarnya mencapai kesimpulan.
encoding_error_output
Grepping cepat untuk encoding_error_output
menunjukkan bahwa satu-satunya jalur kode yang dapat memodifikasinya melewati buf_has_encoding_errors
:
clen = mbrlen (p, buf + size - p, &mbs);
if ((size_t) -2 <= clen)
return true;
lalu saja man mbrlen
.
nlines_first_null dan nlines
Diinisialisasi sebagai:
intmax_t nlines_first_null = -1;
nlines = 0;
jadi ketika null ditemukan 0 <= nlines_first_null
menjadi true.
TODO kapan bisa nlines_first_null < nlines
salah? Saya malas.
POSIX
Tidak mendefinisikan opsi biner grep - cari file untuk suatu pola | pubs.opengroup.org , dan GNU grep tidak mendokumentasikannya, jadi RTFS adalah satu-satunya cara.
--null-data
semoga bermanfaat jikaNUL
pembatas.