स्टड और कमांड लाइन तर्क के बीच प्रदर्शन अंतर


11

कुछ आदेशों के लिए, कुछ इनपुट को स्टैडिन या कमांड लाइन तर्क के रूप में निर्दिष्ट करना संभव है।

विशेष रूप से, मान लें कि commandस्टड इनपुट और एक फ़ाइलनाम कमांड लाइन तर्क के रूप में ले सकता है, और command < myfile, cat myfile | command और command myfileउसी परिणाम का उत्पादन कर सकता है।

उदाहरण के लिए,

जब आदेश है sed:

sed s/day/night/ <myfile >new   
sed s/day/night/ myfile >new    
cat myfile | sed s/day/night/ >new

जब आदेश है cat:

cat < myfile
cat myfile
  1. मैं सोच रहा था कि क्या उनके प्रदर्शन के बारे में कुछ सामान्य नियम हैं, यानी उनमें से कौन सा आमतौर पर सबसे कुशल है, और कौन सा सबसे कम है?
  2. क्या पुनर्निर्देशन हमेशा पाइप से बेहतर होता है?

1
मैं चाहता हूं कि हर कोई इन (डुप्लीकेटेड) सवालों को पूछे और एक अभ्यास के रूप में स्क्रैच से अपने स्वयं के शेल को लिखें।
एलेक्स

1
कृपया "धन्यवाद" का उपयोग न करें आपके सवालों में। अपनी कृतज्ञता व्यक्त करने के लिए वोट का जवाब दें।
एलेक्स

@ एलेक्स: यदि यह एक डूप है, तो कृपया डुप्लिकेट से लिंक करें और हम इसे बंद करने पर काम करेंगे। आमतौर पर आप एक प्रश्न का उत्तर देने से बचते हैं जो आप जानते हैं कि एक डुप्लिकेट है और इसे मॉडरेटर के ध्यान के लिए फ़्लैग करें।
कालेब

1
@alex: मैं अपना शेल लिखना कैसे सीख सकता हूं?
टिम

@ कालेब: मुझे यकीन है कि यह पिछले महीने में 2 या 3 बार पूछा गया था, बस लिंक नहीं है :-p
एलेक्स

जवाबों:


6

cat file | commandवाक्य रचना एक माना जाता है की अनुपयोगी उपयोगCat । आपके सभी विकल्पों में से, यह एक प्रदर्शन हिट लेता है क्योंकि इसे कर्नेल में एक और प्रक्रिया को स्पॉन करना पड़ता है। हालांकि यह बहुत बड़ी तस्वीर में बदल सकता है, यह अन्य रूपों के ऊपर नहीं है। यह इस तरह के सवालों पर कवर किया गया है: क्या मुझे अनावश्यक बिल्लियों की परवाह करनी चाहिए?

अन्य दो रूपों के बीच वस्तुतः कोई प्रदर्शन अंतर नहीं है। STDIN एक विशेष फ़ाइल नोड है जिसे प्रक्रिया को किसी अन्य की तरह खोलना और पढ़ना है। एसटीडीआईएन के बजाय एक फ़ाइल नाम पास करना बस इसे एक अलग फाइल खोलने के लिए बनाता है।

अंतर यह होगा कि आप किन विशेषताओं / लचीलेपन की तलाश कर रहे हैं।

  • फ़ाइल नाम को प्रोग्राम में पास करने का मतलब होगा कि इनपुट फ़ाइल प्राप्य थी। यह कार्यक्रम के लिए महत्वपूर्ण हो सकता है या नहीं भी हो सकता है, लेकिन यदि धारा खोजी जा सकती है तो कुछ ऑपरेशनों को चलाया जा सकता है।
  • वास्तविक इनपुट फ़ाइल को जानने से आपका प्रोग्राम संभावित रूप से इसे लिखने की अनुमति देता है। उदाहरण के sed -iलिए इन-प्लेस एडिटिंग। (नोट: चूंकि इसमें पर्दे के पीछे एक नई फ़ाइल बनानी होती है, यह अन्य रीडायरेक्ट पर प्रदर्शन लाभ नहीं है, लेकिन यह एक सुविधा चरण है।)
  • शेल रीडायरेक्ट का उपयोग करने से आपको कई फ़ाइलों को संक्षिप्त करने या यहां तक ​​कि प्रक्रिया पुनर्निर्देशन का उपयोग करने की सुविधा मिलती है। sed [exp] < file1 file2या भी sed [exp] < <(grep command)। इस उपयोग के मामले का विवरण इस प्रश्न पर पाया जा सकता है: प्रक्रिया प्रतिस्थापन और पाइप

प्रक्रिया प्रतिस्थापन आपको परिणाम को पाइप करने की आवश्यकता के बिना काम करना चाहिए; sed [exp] < <(grep command)के रूप में ठीक काम करेगा sed [exp] <(grep command)(चूंकि <(grep command)कमांड की लंबाई के लिए एक नामित अस्थायी फ़ाइल बनाता है जो sedशेल सहायता के बिना अपने आप खुलने में सक्षम है)।
शैडो रेंजर

2
  1. यह देखते हुए कि command fileबस फ़ाइल को खोलता है और तब से काम करता है जैसे कि अगर यह था stdin, तो बहुत कम अंतर है। शेल पुनर्निर्देशन के साथ आप केवल फ़ाइल को पहले से खोलते हैं (शेल करता है,) बाइनरी ही कमांड के विपरीत।

  2. यदि हम cat file | commandबनाम के बारे में बात कर रहे हैं command <file, तो बाद वाला पसंद किया जाता है। आप दोनों के बीच महत्वपूर्ण प्रदर्शन अंतर को नोटिस नहीं करने जा रहे हैं, लेकिन पूर्व अनावश्यक रूप से जटिल है (सीमित प्रक्रिया और पाइप के लिए साझा मेमोरी बफर, सीमित थ्रूपुट के साथ।) इसके अलावा, आप seek(फ़ाइल सूचक स्थिति को मनमाने ढंग से नहीं बदल सकते हैं ) पाइप, जबकि आप एक साधारण फ़ाइल में कर सकते हैं। कुछ कमांड अधिक कुशल एल्गोरिथ्म का उपयोग कर सकते हैं जब seekइनपुट फ़ाइल में संभव है।


मैं कहूंगा कि कमांड फ़ाइल को कमांड <फ़ाइल से अधिक पसंद किया जाता है, क्योंकि कमांड कुछ प्रकार की गैर-अनुक्रमिक पहुंच कर सकता है।
user606723

और ऐसा करने से क्या होगा <file? आपकी बात आउटपुट फ़ाइल नाम को कठिन बनाने के लिए इनपुट फ़ाइल नाम का उपयोग करने के लिए मान्य है, जैसे: gzip fileउत्पादन file.gz
एलेक्स

शायद मुझे समझ नहीं आता कि पुनर्निर्देशन आंतरिक रूप से कैसे काम करता है। आओ हम एक 12GB की मूवी को mplayer / vlc में रीडायरेक्ट करते हैं, और फिर हम अंत तक छोड़ देते हैं। वास्तव में इस मामले में क्या होगा?
user606723

1
शेल फ़ाइल को खोलता है और एक उप-प्रक्रिया की तलाश करता है, जो फ़ाइल विवरणक को विरासत में मिला है। फोर्क्ड प्रक्रिया closeएस stdinऔर कॉल dupकी गई फ़ाइल डिस्क्रिप्टर पर कॉल करती है, इसलिए यह पुराने को बदल देती है stdin(जो कि ज्यादातर मामलों में किसी प्रकार का था।) फिल्म खिलाड़ी के दृष्टिकोण से इसके बीच कोई अंतर नहीं है और फ़ाइल को इसके नाम से खोलना है। खिलाड़ी ही। फ़ाइल डिस्क्रिप्टर दोनों परिदृश्यों में प्राप्य है, इसलिए जब हम अंत तक जाते हैं तो कोई उपयोगकर्ता-पता करने योग्य अंतर नहीं होता है।
एलेक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.