সি স্ট্যান্ডার্ড আই / ও লাইব্রেরি ( stdio
) অনুসরণ করে একটি সাধারণ বাফারিং নিয়ম রয়েছে যা বেশিরভাগ ইউনিক্স প্রোগ্রাম ব্যবহার করে। যদি আউটপুট কোনও টার্মিনালে চলে যায় তবে প্রতিটি লাইনের শেষে এটি ফ্লাশ করা হয়; অন্যথায় এটি কেবল তখনই ফ্লাশ করা হয় যখন বাফার (আমার লিনাক্স / এমডি 64 সিস্টেমের মধ্যে 8 কে; আপনার নিজের চেয়ে আলাদা হতে পারে) পূর্ণ হয়।
আপনার সব ইউটিলিটি সাধারণ নিয়ম অনুসরণ করা হয়, তাহলে আপনি দেখতে হবে আউটপুট আপনার উদাহরণ সব বিলম্বিত ( cat|sed
, cat|tr
, এবং cat|tr|sed
)। তবে এর ব্যতিক্রম আছে: জিএনইউ cat
কখনই এর আউটপুটটিকে বাফার করে না। এটি হয় না ব্যবহার করে stdio
বা এটি ডিফল্ট stdio
বাফারিং নীতি পরিবর্তন করে ।
আমি মোটামুটি নিশ্চিত হতে পারি যে আপনি জিএনইউ ব্যবহার করছেন cat
এবং অন্য কোনও ইউনিক্স নয় cat
কারণ অন্যরা এইভাবে আচরণ করবে না। গতানুগতিক ইউনিক্সে আনফারড আউটপুট অনুরোধ করার বিকল্প cat
রয়েছে -u
। জিএনইউ বিকল্পটিকে cat
উপেক্ষা করে -u
কারণ এর আউটপুট সর্বদা অবিরাম থাকে।
সুতরাং যখনই আপনার cat
বাম দিকে পাইপ থাকবে, জিএনইউ সিস্টেমে, পাইপের মাধ্যমে ডেটা উত্তরণে বিলম্ব হবে না। cat
এমনকি পাতিপাতি যাচ্ছে না - আপনার টার্মিনাল যে করছে। যখন আপনি বিড়াল করুন না টাইপিং ইনপুট, আপনার টার্মিনাল "ক্যাননিকাল" মোডে রয়েছে - লাইন ভিত্তিক, সম্পাদনা ব্যাকস্পেস এবং Ctrl-ইউ মত কী সম্পাদনা করতে সুযোগ লাইন আপনার সাথে পাঠানোর আগে টাইপ করেছেন প্রস্তাব দিয়ে Enter।
ইন cat|tr|sed
উদাহরণস্বরূপ, tr
এখনও থেকে তথ্য গ্রহণ করা হয় cat
যত তাড়াতাড়ি আপনি টিপুন Enter, কিন্তু tr
অনুসরণ করছে stdio
ডিফল্ট নীতি: তার আউটপুট একটি নল যাচ্ছে, তাই এটি প্রতিটি লাইনে পর ফ্লাশ না। এটি দ্বিতীয় পাইপটিতে লেখায় বাফারটি পূর্ণ হয়ে গেলে বা কোনও ইওএফ পাওয়ার পরে, যেটি প্রথমে আসে।
sed
এছাড়াও stdio
ডিফল্ট নীতি অনুসরণ করে , তবে এর আউটপুটটি টার্মিনালে চলেছে তাই এটি প্রতিটি লাইনের সাথে এটি শেষ হওয়ার সাথে সাথেই এটি লিখবে। তাহলে - এই আপনি পাইপলাইন অপর প্রান্তের আপ কিছু শো সামনে কত টাইপ করতে হবে প্রভাব আছে sed
ছিল ব্লক-বাফার উপলব্ধ তার আউটপুট, আপনি অনেক (ভরাট হিসেবে দুইবার টাইপ করতে হবে চাই tr
'র আউটপুট বাফার এবং sed
গুলি আউটপুট' বাফার)।
গনুহ sed
হয়েছে -u
বিকল্প তাই যদি আপনি অর্ডার বিপরীত এবং ব্যবহৃত cat|sed -u|tr
আপনি আউটপুট সঙ্গে সঙ্গে আবার প্রদর্শিত দেখতে হবে। ( sed -u
বিকল্পটি অন্য কোথাও উপলভ্য হতে পারে তবে আমার মনে হয় না এটি প্রাচীন ইউনিক্স likeতিহ্যের মতো cat -u
) তবে আমি যতটা বলতে পারি এর সমতুল্য বিকল্প নেই tr
।
একটি ইউটিলিটি বলা হয় stdbuf
যা আপনাকে stdio
ডিফল্ট ব্যবহার করে এমন কোনও কমান্ডের বাফারিং মোড পরিবর্তন করতে দেয় । এটি কিছুটা নাজুক যেহেতু এটি LD_PRELOAD
সি লাইব্রেরিকে সমর্থন করার জন্য ডিজাইন করা হয়নি এমন কিছু অর্জন করতে ব্যবহার করে তবে এই ক্ষেত্রে এটি কাজ করে বলে মনে হয়:
cat | stdbuf -o 0 tr '[:lower:]' '[:upper:]' | sed 'p'
cat
স্টিডিন বন্ধ না হওয়া পর্যন্ত এটি বাফার করছে।