আপনি যদি কেবল প্রথম লাইনটি চান তবে নিম্নলিখিত ধরণের কৌশলটি আউটপুট স্ট্রিমটি পড়তে দুটি পৃথক কমান্ড ব্যবহার করে বাফারিং সমস্যাগুলি এড়িয়ে চলে:
$ ps -eF | { IFS= read -r x ; echo "$x" ; grep worker; }
$ ls -la / | { IFS= read -r x ; echo "$x" ; grep sbin; }
read
বিল্ট-ইন করা হয় শেল এবং মাত্র আউটপুট এক লাইন ইনপুট একজন সমগ্র বাফার গ্রাস করে না, তাই ব্যবহার read
পাতার নিম্নলিখিত কমান্ডের জন্য আউটপুট বাকি সব।
আপনি যদি দুটি উদাহরণ ব্যবহার করে আপনার উদাহরণ দ্বারা দেখানো বাফারিং সমস্যাগুলিকে বোঝাতে চান sleep
তবে সময় সংক্রান্ত সমস্যাগুলি মুছে ফেলার জন্য এগুলিতে একটি যুক্ত করুন এবং ডান দিকের কমান্ডগুলির মধ্যে যে কোনও একটি পড়ার চেষ্টা করার আগে বাম দিকের কমান্ডটি তার সমস্ত আউটপুট তৈরি করতে দেয় allow এটা:
$ ps -eF | { sleep 5 ; head -n 1 ; grep worker; }
$ ls -la / | { sleep 5 ; head -n 1 ; grep sbin; }
এখন, উপরের দুটি উদাহরণ একইভাবে ব্যর্থ হয়েছে - head
কেবলমাত্র একটি লাইন তৈরি করতে আউটপুটটির পুরো বাফারটি পড়ে এবং সেই বাফারটি নিম্নলিখিতটিতে উপলভ্য নয় grep
।
আউটপুট লাইনের সংখ্যা রয়েছে এমন কয়েকটি উদাহরণ ব্যবহার করে আপনি বাফারিং সমস্যাটি আরও স্পষ্ট দেখতে পাচ্ছেন যাতে কোন লাইনগুলি অনুপস্থিত রয়েছে তা আপনি বলতে পারেন:
$ ps -eF | cat -n | { sleep 5 ; head -n 1 ; head ; }
$ ls -la /usr/bin | cat -n | { sleep 5 ; head -n 1 ; head ; }
বাফারিং সমস্যাটি দেখার একটি সহজ উপায় হ'ল এটি ব্যবহার করে seq
যা সংখ্যার একটি তালিকা তৈরি করে। কোন সংখ্যাটি নিখোঁজ হয় তা আমরা সহজেই বলতে পারি:
$ seq 1 100000 | { sleep 5 ; head -n 1 ; head ; }
1
1861
1862
1863
1864
1865
1866
1867
1868
1869
আমার কৌতুক সমাধানটি প্রথম লাইনটি পড়তে এবং প্রতিধ্বনিত করতে শেল ব্যবহার করে এমনকি ঘুমের বিলম্বের সাথে যুক্ত হয়েও সঠিকভাবে কাজ করে:
$ seq 1 100000 | { sleep 5 ; IFS= read -r x ; echo "$x" ; head ; }
1
2
3
4
5
6
7
8
9
10
11
নীচে head
বাফারিংয়ের সমস্যাগুলি দেখানোর জন্য একটি সম্পূর্ণ উদাহরণ দেওয়া হচ্ছে , head
প্রতিবার তার পাঁচটি লাইন তৈরি করার জন্য কীভাবে আউটপুটটির পুরো বাফারটি ব্যয় করে তা দেখানো হয়
। head
ক্রমযুক্ত পরবর্তী কমান্ডের জন্য যে গ্রাস করা বাফারটি পাওয়া যায় না
:
$ seq 1 100000 | { sleep 5 ; head -5 ; head -5 ; head -5 ; head -5 ; }
1
2
3
4
5
1861
1862
1863
1864
499
3500
3501
3502
3503
7
5138
5139
5140
5141
1861
উপরের সংখ্যাটি দেখে , আমরা আউটপুট থেকে head
গুনে বাফারটি ব্যবহার করে বাফারের আকারটি গণনা করতে পারি
:seq
1
1860
$ seq 1 1860 | wc -c
8193
আমরা দেখতে পাই যে head
পাইপ আউটপুটটির সম্পূর্ণ 8 কেবি (8 * 1024 বাইট) একবারে এমনকি নিজের আউটপুটটির কয়েক লাইন উত্পাদন করতে পেরে বাফার করছে।
head
এবংgrep
কিছুই না।