यदि आप केवल पहली पंक्ति या दो चाहते हैं, तो निम्न प्रकार की ट्रिक काम करती है और आउटपुट स्ट्रीम को पढ़ने के लिए दो अलग-अलग कमांड्स का उपयोग करके होने वाली बफरिंग समस्याओं से बचा जाता है:
$ ps -eF | { IFS= read -r x ; echo "$x" ; grep worker; }
$ ls -la / | { IFS= read -r x ; echo "$x" ; grep sbin; }
read
अंतर्निहित है खोल करने के लिए और सिर्फ उत्पादन एक लाइन के लिए इनपुट की एक पूरी बफर का उपभोग नहीं करता, इसलिए का उपयोग कर read
पत्ते निम्न आदेश के लिए उत्पादन के सभी बाकी।
यदि आप अपने उदाहरणों द्वारा दर्शाई गई बफ़रिंग समस्याओं को दूर करना चाहते हैं, जो दो अलग-अलग कमांडों का उपयोग करते हैं, sleep
तो टाइमिंग के मुद्दों को खत्म करने के लिए उनमें से एक को जोड़ें और दाईं ओर दिए गए आदेशों को पढ़ने से पहले अपने सभी आउटपुट को उत्पन्न करने के लिए बाईं ओर कमांड को अनुमति दें। यह:
$ ps -eF | { sleep 5 ; head -n 1 ; grep worker; }
$ ls -la / | { sleep 5 ; head -n 1 ; grep sbin; }
अब, उपरोक्त दोनों उदाहरण एक ही तरह से विफल हो जाते हैं - head
आउटपुट का एक पूरा बफर पढ़ता है बस एक लाइन का उत्पादन करने के लिए, और वह बफर निम्नलिखित के लिए उपलब्ध नहीं है grep
।
आप कुछ उदाहरणों का उपयोग करके बफ़रिंग समस्या को और भी स्पष्ट रूप से देख सकते हैं जो आउटपुट लाइनों की संख्या बताती है ताकि आप बता सकें कि कौन सी लाइनें गायब हैं:
$ ps -eF | cat -n | { sleep 5 ; head -n 1 ; head ; }
$ ls -la /usr/bin | cat -n | { sleep 5 ; head -n 1 ; head ; }
बफ़रिंग समस्या को देखने का एक सरल तरीका यह है seq
कि संख्याओं की सूची तैयार की जाए। हम आसानी से बता सकते हैं कि कौन सी संख्या गायब है:
$ seq 1 100000 | { sleep 5 ; head -n 1 ; head ; }
1
1861
1862
1863
1864
1865
1866
1867
1868
1869
नींद में देरी के साथ भी पहली पंक्ति के काम को पढ़ने और गूँजने के लिए शेल का उपयोग करके मेरा ट्रिक सॉल्यूशन जोड़ा गया है:
$ seq 1 100000 | { sleep 5 ; IFS= read -r x ; echo "$x" ; head ; }
1
2
3
4
5
6
7
8
9
10
11
नीचे head
बफ़रिंग मुद्दों को दिखाते हुए एक पूर्ण उदाहरण दिया गया है, जिसमें दिखाया गया है कि head
हर बार अपनी पांच लाइनों का उत्पादन करने के लिए आउटपुट का एक पूरा बफर कैसे
खपत करता है। वह भस्म बफर head
अनुक्रम में अगले कमांड के लिए उपलब्ध नहीं है
:
$ seq 1 100000 | { sleep 5 ; head -5 ; head -5 ; head -5 ; head -5 ; }
1
2
3
4
5
1861
1862
1863
1864
499
3500
3501
3502
3503
7
5138
5139
5140
5141
संख्या को देखते हुए 1861
ऊपर, हम गणना कर सकते हैं बफर के आकार के आधार पर इस्तेमाल किया जा रहा head
की गणना के द्वारा seq
से उत्पादन 1
करने के लिए
1860
:
$ seq 1 1860 | wc -c
8193
हम देखते हैं कि head
एक समय में पाइप उत्पादन का पूरा 8KB (8 * 1024 बाइट्स) पढ़ने से बफरिंग होती है, यहां तक कि अपने स्वयं के आउटपुट की कुछ लाइनों का उत्पादन करने के लिए भी।
head
औरgrep
वहाँ कुछ भी नहीं है।