কমান্ডগুলি সাধারণত তাদের ইনপুটটি বাফার করে না। তারা read()
একটি বড় অংশের জন্য একটি কাজ করবে , কিন্তু যখন পাইপ থেকে পড়তে হবে, পাইপে যদি এমন অনেকগুলি বাইট না থাকে তবে read()
সিস্টেম কলটি যতগুলি অক্ষর রয়েছে তার সাথে ফিরে আসবে এবং অ্যাপ্লিকেশনটি যদি এটি করতে পারে তবে এটির সাথে সাধারণত কাজ করবে ।
এটির ক্ষেত্রে একটি উল্লেখযোগ্য ব্যতিক্রম mawk
যা read()
ইনপুট বাফারটি পূর্ণ না হওয়া পর্যন্ত পুনরায় চালু রাখতে থাকবে।
অ্যাপ্লিকেশনগুলি যদিও তাদের আউটপুট (স্টাডআউট) বাফার করে । স্বাভাবিক আচরণটি হ'ল যদি আউটপুটটি একটি টিটি-তে চলে যায়, তবে বাফারিংটি লাইন-ওয়াইস হবে (অর্থাৎ এটি আউটপুটে সম্পূর্ণ লাইন না হওয়া পর্যন্ত স্টাডাউটে লেখা শুরু করবে না বা খুব বেশি ব্লক-পূর্ণ হবে) দীর্ঘ লাইন), অন্য প্রতিটি ধরণের ফাইলের জন্য, বাফারিংগুলি ব্লকগুলি দ্বারা হয় (এটি লেখার জন্য একটি ব্লক পূর্ণ না হওয়া পর্যন্ত এটি লেখা শুরু করবে না (4KiB / 8KiB এর মতো কিছু ... সফ্টওয়্যার এবং সিস্টেমের উপর নির্ভর করে ))।
সুতরাং আপনার ক্ষেত্রে LongRunningCommand
সম্ভবত এটির ফলাফলকে ব্লক দ্বারা বাফার করে (যেহেতু এর আউটপুটটি পাইপ এবং কোনও টিটি নয়) এবং tr
সম্ভবত আউটপুটটি টার্মিনাল হওয়ায় সম্ভবত আউটপুটটিকে লাইন দিয়ে বাফার করে।
তবে, যেহেতু আপনি প্রতিটি নিউলাইন চরিত্রটিকে এর আউটপুট থেকে সরান, এটি কখনই একটি লাইন আউটপুট দেয় না, তাই বাফারিং ব্লক হয়ে যাবে।
তাই এখানে আপনি উভয় জন্য অক্ষম বাফার উপলব্ধ করতে চান LongRunningCommand
এবং tr
। জিএনইউ বা ফ্রিবিএসডি সিস্টেমে:
stdbuf -o0 LongRunningCommand | stdbuf -o0 tr '\n' ,
মনে রাখবেন যে আপনি যদি কমা দিয়ে লাইনে যোগদান করতে চান তবে আরও ভাল পদ্ধতির ব্যবহার করা উচিত paste -sd , -
। এই ভাবে আউটপুটটি একটি নতুন লাইন চরিত্রের মাধ্যমে শেষ করা হবে (আপনার সম্ভবত এখনও বাফারিং অক্ষম করা দরকার)।
stdbuf
আপনি লংআরনিংকম্যান্ডে আবেদন করেছেন বা ট্র, বা উভয়কে আলাদাভাবে?