GNU grep 2.24 RTFS
නිගමනය: නඩු 2 සහ 2 පමණි:
NUL
, උදා printf 'a\0' | grep 'a'
C99 අනුව කේතීකරණ දෝෂය mbrlen()
, උදා:
export LC_CTYPE='en_US.UTF-8'
printf 'a\x80' | grep 'a'
\x80
යූටීඑෆ් -8 යුනිකෝඩ් ලක්ෂ්යයක පළමු බයිටය විය නොහැකි නිසා : යූටීඑෆ් -8 - විස්තරය | en.wikipedia.org
තවද, ස්ටෙෆාන් චසෙලාස් සඳහන් කළ පරිදි grep ගොනුවක් ද්විමය ලෙස සලකන්නේ කුමක් ද? | යුනික්ස් සහ ලිනක්ස් ස්ටැක් එක්ස්චේන්ජ් , එම චෙක්පත් සිදු කරනු ලබන්නේ ටෝඩෝ දිග කියවන පළමු බෆරය දක්වා පමණි.
පළමු බෆරය කියවීම දක්වා පමණි
එබැවින් ඉතා විශාල ගොනුවක් මධ්යයේ NUL හෝ කේතීකරණ දෝෂයක් සිදුවුවහොත් එය කෙසේ හෝ අතුගා දැමිය හැකිය.
මම හිතන්නේ මෙය කාර්ය සාධන හේතූන් මත ය.
උදා: මෙය පේළිය මුද්රණය කරයි:
printf '%10000000s\n\x80a' | grep 'a'
නමුත් මෙය එසේ නොවේ:
printf '%10s\n\x80a' | grep 'a'
සත්ය බෆරයේ ප්රමාණය ගොනුව කියවන ආකාරය මත රඳා පවතී. උදා සංසන්දනය කරන්න:
export LC_CTYPE='en_US.UTF-8'
(printf '\n\x80a') | grep 'a'
(printf '\n'; sleep 1; printf '\x80a') | grep 'a'
සමග sleep
, පළමු පෙළ ක්රියාවලිය නින්දට යයි, ගොනුව ද්විමය නම් දෙවන කියවා බලන්න නැති නිසා එය දිගු 1 බයිට පමණක් වුවද grep කිරීමට සමත් වී යයි.
RTFS
git clone git://git.savannah.gnu.org/grep.git
cd grep
git checkout v2.24
Stderr දෝෂ පණිවිඩය කේතනය කර ඇති ස්ථානය සොයා ගන්න:
git grep 'Binary file'
අප වෙත යොමු වන්නේ /src/grep.c
:
if (!out_quiet && (encoding_error_output
|| (0 <= nlines_first_null && nlines_first_null < nlines)))
{
printf (_("Binary file %s matches\n"), filename);
එම විචල්යයන් හොඳින් නම් කර ඇත්නම්, අපි මූලික වශයෙන් නිගමනයකට එළඹුනෙමු.
encoding_error_output
encoding_error_output
එය වෙනස් කළ හැකි එකම කේත මාර්ගය හරහා යන බව පෙන්වීම සඳහා ඉක්මන් ග්රහණය කිරීම buf_has_encoding_errors
:
clen = mbrlen (p, buf + size - p, &mbs);
if ((size_t) -2 <= clen)
return true;
ඊට පස්සෙ man mbrlen
.
nlines_first_null සහ nlines
ආරම්භ කළේ:
intmax_t nlines_first_null = -1;
nlines = 0;
එබැවින් ශුන්යයක් සොයාගත් විට 0 <= nlines_first_null
එය සත්ය වේ.
TODO nlines_first_null < nlines
කවදා හෝ අසත්ය විය හැක්කේ කවදාද? මට කම්මැලි විය.
පොසික්ස්
ද්විමය විකල්ප grep නිර්වචනය නොකරයි - රටාවක් සඳහා ගොනුවක් සොයන්න | pubs.opengroup.org , සහ GNU grep එය ලේඛනගත නොකරයි, එබැවින් RTFS එකම ක්රමයයි.
--null-data
NUL
පරිසීමකය නම් ප්රයෝජනවත් විය හැකිය .