सी मानक 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
डिफ़ॉल्ट नीति: इसके उत्पादन एक पाइप लिए जा रहा है, तो यह प्रत्येक पंक्ति के बाद फ्लश नहीं करता है। यह दूसरा पाइप को लिखता है जब बफर भरा होता है, या जब एक ईओएफ प्राप्त होता है, जो भी पहले आता है।
sed
stdio
डिफ़ॉल्ट नीति का भी पालन कर रहा है, लेकिन इसका आउटपुट टर्मिनल पर जा रहा है, इसलिए जैसे ही यह समाप्त हो जाएगा, यह प्रत्येक पंक्ति को लिख देगा। यदि - यह आप पाइपलाइन के दूसरे छोर पर कुछ शो से पहले कितना लिखना चाहिए पर एक प्रभाव है 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
तब तक बफरिंग करता है जब तक स्टड बंद नहीं हो जाता।