জিএনইউ গ্রেপ 2.24 আরটিএফএস
উপসংহার: কেবলমাত্র 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
তদ্ব্যতীত, স্টাফেন চেজেলাস দ্বারা উল্লিখিত গ্রাইপ কোন ফাইলকে বাইনারি হিসাবে বিবেচনা করে? | ইউনিক্স এবং লিনাক্স স্ট্যাক এক্সচেঞ্জ , এই চেকগুলি কেবলমাত্র টোডো দৈর্ঘ্যের প্রথম বাফার রিড পর্যন্ত সম্পন্ন হয়।
শুধুমাত্র প্রথম বাফার পর্যন্ত পড়া
সুতরাং যদি কোনও 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 বাইট দীর্ঘ হলেও পাকাপাকিভাবে গ্রেপ হয়ে যায় কারণ প্রক্রিয়াটি ঘুমাতে যায়, এবং দ্বিতীয় পঠনটি ফাইলটি বাইনারি রয়েছে কিনা তা পরীক্ষা করে না।
RTFS
git clone git://git.savannah.gnu.org/grep.git
cd grep
git checkout v2.24
স্ট্যাডার ত্রুটি বার্তাটি এনকোড করা হয়েছে তা সন্ধান করুন:
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
গেলে সত্য হয়ে যায়।
টোডো কখন nlines_first_null < nlines
মিথ্যা হতে পারে? অলস হয়ে গেলাম।
POSIX
বাইনারি বিকল্পগুলি গ্রেপ সংজ্ঞায়িত করে না - একটি প্যাটার্নের জন্য একটি ফাইল অনুসন্ধান করুন pubs.opengroup.org , এবং GNU গ্রেপ এটি নথিভুক্ত করে না, সুতরাং আরটিএফএসই একমাত্র উপায়।
--null-data
NUL
ডিলিমিটার হলে কার্যকর হতে পারে ।