सी मानक I / O लाइब्रेरी ( stdio) के बाद एक सामान्य बफ़रिंग नियम है जो अधिकांश यूनिक्स प्रोग्राम का उपयोग करता है। यदि आउटपुट टर्मिनल पर जा रहा है, तो इसे प्रत्येक पंक्ति के अंत में फ्लश किया जाता है; अन्यथा यह तभी फ़्लश होता है जब बफर (मेरे लिनक्स / amd64 सिस्टम पर 8K, आप पर अलग हो सकता है) भरा हुआ है।
अपने सभी उपयोगिताओं सामान्य नियम निम्नलिखित थे, तो आप देखना होगा उत्पादन अपने उदाहरण के सभी में देरी ( cat|sed, cat|tr, और cat|tr|sed)। लेकिन इसका एक अपवाद है: GNU catकभी भी इसका आउटपुट बफ़र नहीं करता है। यह या तो उपयोग नहीं करता है stdioया यह डिफ़ॉल्ट stdioबफ़रिंग नीति को बदलता है ।
मुझे पूरा यकीन है कि आप GNU का उपयोग कर रहे हैं catऔर कुछ अन्य यूनिक्स का नहीं catक्योंकि अन्य इस तरह से व्यवहार नहीं करेंगे। पारंपरिक यूनिक्स के catपास -uविकल्पहीन आउटपुट का अनुरोध करने का विकल्प है। GNU विकल्प को catअनदेखा करता -uहै क्योंकि इसका आउटपुट हमेशा अप्रभावित रहता है।
तो जब भी आपके पास catबाईं तरफ एक पाइप होता है , तो जीएनयू सिस्टम में, पाइप के माध्यम से डेटा के पारित होने में देरी नहीं होगी। catयहां तक कि लाइन द्वारा लाइन में नहीं जा रहा है - अपने टर्मिनल कि कर रही है। जब आप बिल्ली के लिए इनपुट टाइप कर रहे होते हैं, तो आपका टर्मिनल "कैनोनिकल" मोड में होता है - लाइन-बेस्ड, जिसमें बैकस्पेस और ctrl-U जैसी एडिटिंग कीज़ होती हैं, जो आपको उस लाइन को एडिट करने का मौका देता है जिसे आपने भेजने से पहले टाइप किया है Enter।
में cat|tr|sedउदाहरण के लिए, trअभी भी से डेटा प्राप्त कर रहा है catजैसे ही आप प्रेस Enter, लेकिन trपीछा कर रहा है stdioडिफ़ॉल्ट नीति: इसके उत्पादन एक पाइप लिए जा रहा है, तो यह प्रत्येक पंक्ति के बाद फ्लश नहीं करता है। यह दूसरा पाइप को लिखता है जब बफर भरा होता है, या जब एक ईओएफ प्राप्त होता है, जो भी पहले आता है।
sedstdioडिफ़ॉल्ट नीति का भी पालन कर रहा है, लेकिन इसका आउटपुट टर्मिनल पर जा रहा है, इसलिए जैसे ही यह समाप्त हो जाएगा, यह प्रत्येक पंक्ति को लिख देगा। यदि - यह आप पाइपलाइन के दूसरे छोर पर कुछ शो से पहले कितना लिखना चाहिए पर एक प्रभाव है sedथा ब्लॉक बफरिंग इसके उत्पादन, आप ज्यादा (भरने के रूप में दो बार टाइप करने के लिए होगा trके उत्पादन बफर और sed रों उत्पादन ' बफर)।
जीएनयू के sedपास -uविकल्प है यदि आप आदेश को उलटते हैं और उपयोग cat|sed -u|trकरते हैं तो आपको आउटपुट तुरंत फिर से दिखाई देगा। ( sed -uविकल्प कहीं और उपलब्ध हो सकता है लेकिन मुझे नहीं लगता कि यह एक प्राचीन यूनिक्स परंपरा है cat -u) जहां तक मैं बता सकता हूं कि इसके लिए कोई समकक्ष विकल्प नहीं है tr।
एक उपयोगिता है जिसे कहा जाता है stdbufजो आपको किसी भी कमांड के बफरिंग मोड को बदलने देता है जो stdioचूक का उपयोग करता है । यह थोड़ा नाजुक है क्योंकि इसका उपयोग LD_PRELOADसी लाइब्रेरी को समर्थन देने के लिए डिज़ाइन नहीं किया गया है, लेकिन इस मामले में यह काम करता है:
cat | stdbuf -o 0 tr '[:lower:]' '[:upper:]' | sed 'p'
catतब तक बफरिंग करता है जब तक स्टड बंद नहीं हो जाता।