कमांड आमतौर पर अपने इनपुट को बफर नहीं करते हैं। वे read()एक बड़े चंक के लिए करते हैं, लेकिन एक पाइप से पढ़ते समय, अगर पाइप में कई बाइट्स नहीं हैं, तो read()सिस्टम कॉल में जितने अक्षर हैं, उतने ही रिटर्न होंगे और एप्लिकेशन आम तौर पर उसी के साथ काम करेगा यदि यह हो सकता है ।
इसके लिए एक उल्लेखनीय अपवाद है mawkजो read()इनपुट बफ़र के पूर्ण होने तक फिर से चालू रहेगा।
एप्लिकेशन हालांकि उनके आउटपुट (स्टडआउट) को बफर करते हैं । सामान्य व्यवहार यह है कि यदि आउटपुट टेंट में जा रहा है, तो बफरिंग लाइन-वार होगी (अर्थात, यह तब तक लिखना बंद नहीं करेगी, जब तक कि आउटपुट के लिए पूरी लाइन न हो, या बहुत के लिए ब्लॉक-फुल हो। लंबी लाइन), जबकि हर दूसरे प्रकार की फ़ाइल के लिए, बफ़रिंग ब्लॉक के द्वारा होती है (अर्थात, यह तब तक लिखना शुरू नहीं करेगा जब तक कि लिखने के लिए एक ब्लॉक पूरा न हो जाए (4KiB / 8KiB जैसा कुछ ... सॉफ्टवेयर और सिस्टम पर निर्भर करता है) ))।
तो आपके मामले में LongRunningCommandसंभवतया ब्लॉक द्वारा इसका आउटपुट बफ़र्स करता है (क्योंकि इसका आउटपुट एक पाइप है और एक tty नहीं है), और trसंभावना है कि इसका आउटपुट लाइन से इसका आउटपुट बफ़र्स करता है क्योंकि इसका आउटपुट शायद टर्मिनल है।
लेकिन, चूँकि आप प्रत्येक न्यूलाइन वर्ण को उसके आउटपुट से हटाते हैं, यह कभी भी एक लाइन को आउटपुट नहीं करेगा, इसलिए बफरिंग ब्लॉक से होगी।
तो यहाँ आप दोनों के लिए बफ़रिंग अक्षम करना चाहते हैं LongRunningCommandऔर tr। GNU या FreeBSD सिस्टम पर:
stdbuf -o0 LongRunningCommand | stdbuf -o0 tr '\n' ,
ध्यान दें कि यदि आप कॉमा के साथ लाइनों में शामिल होना चाहते हैं, तो बेहतर दृष्टिकोण का उपयोग करना है paste -sd , -। इस तरह आउटपुट को एक नए वर्ण द्वारा समाप्त कर दिया जाएगा (आपको शायद अभी भी बफरिंग को अक्षम करना होगा)।
stdbufLongRunningCommand या tr, या दोनों को अलग-अलग तरीके से लागू किया?