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