সি স্ট্যান্ডার্ড আই / ও লাইব্রেরি ( 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স্টিডিন বন্ধ না হওয়া পর্যন্ত এটি বাফার করছে।