2015-09-01 2 views
5

यदि मैं कई फ़ाइलों के साथ निर्देशिका में ls folder | head चलाता हूं, तो निष्पादन समय ls folder | tail से लगभग 50 गुना तेज है। क्या head कमांड ls को निष्पादित करने से रोकता है जब उसके पास पर्याप्त (10) रेखाएं होती हैं?क्या पाइपिंग एलएस को हेड स्टॉप करना है, यह निष्पादन आधा रास्ता है?

मुझे इसका कहीं भी जवाब नहीं मिला क्योंकि "पाइप टू हेड" मुझे Google या यहां पर असंबद्ध परिणाम देता है।

यदि उत्तर नहीं है, तो क्या ls पूरी तरह से चलाने और head के साथ आउटपुट काटने के बजाय केवल कुछ फ़ाइलों को सूचीबद्ध करने का एक और अधिक प्रभावी तरीका है?

उत्तर

10

एक बार head पर्याप्त लाइनों पढ़ा है से यह stdin (ls की stdout) बंद कर देता है stdin है, तो यह बाहर निकल जाता है और इसलिए। जब ऐसा होता है, तो पाइप टूटा माना जाता है और ls को SIGPIPE सिग्नल प्राप्त होता है। इसके प्रति प्रतिक्रिया के रूप में यह सामान्य रूप से सामान्य रूप से किए जाने वाले सब कुछ को संसाधित करने से पहले भी समाप्त होता है। tail के मामले में, इसे ls के लिए प्रतीक्षा करना होगा ताकि यह पता चल सके कि कौन सी एक्स लाइनें आखिरी थीं।

+1

इससे लोगों के लिए बहुत भ्रम पैदा होता है जो इस व्यवहार की अपेक्षा नहीं करते हैं। हम अक्सर लोगों से पूछेंगे कि "जब मैं इसे 'हेड' पर पाइप करता हूं तो मेरा प्रोग्राम क्रैश/त्रुटि क्यों होता है?"। और जवाब आमतौर पर यह माना जाता है कि कार्यक्रम ने अपने सभी लिखने को 'stdout' में सफल माना होगा। –

0

यह और अधिक कुशल हो जाएगा के रूप में कोई नई प्रक्रियाओं बनाई गई हैं:

a=(folder/*) 
echo ${a[@]:0:9} 

ही मामलों में यह और भी बेहतर आप folder/ पहले जोड़ें करने के लिए यदि आप परिणाम के साथ कुछ करना चाहता हूँ की जरूरत नहीं है के रूप में हो सकता है।

संबंधित मुद्दे