2011-05-02 12 views
19

अरे मैं थोड़ी देर के लिए लिनक्स का उपयोग कर रहा हूं और सोचा कि आखिर में खोल स्क्रिप्टिंग में गोता लगाने का समय था।क्या पर्ल या पायथन पर बैश का उपयोग करने का कोई फायदा है?

समस्या यह है कि मैं पर्ल या पायथन जैसे कुछ पर बैश का उपयोग करने का कोई महत्वपूर्ण लाभ खोजने में विफल रहा हूं। क्या दोनों के बीच कोई प्रदर्शन या शक्ति अंतर है? मुझे लगता है कि पाइथन/पर्ल अधिक शक्तिशाली और दक्षता के रूप में उपयुक्त होगा।

उत्तर

6

पर्ल स्क्रिप्ट आमतौर पर (यदि 100% समय नहीं) बैश से तेज़ होते हैं।

कि इस बारे में चर्चा: Perl vs Bash

3

अजगर या पर्ल स्क्रिप्ट से अधिक POSIX शेल स्क्रिप्ट का सबसे महत्वपूर्ण लाभ यह है कि एक POSIX खोल लगभग हर यूनिक्स मशीन पर उपलब्ध है। (कुछ कार्य भी हैं, खोल स्क्रिप्ट के लिए थोड़ा और सुविधाजनक होना होता है, लेकिन यह एक बड़ा मुद्दा नहीं है।) यदि पोर्टेबिलिटी आपके लिए कोई मुद्दा नहीं है, तो मुझे शेल स्क्रिप्टिंग सीखने की बहुत आवश्यकता नहीं दिखाई देती है।

+0

पर्ल के साथ प्रत्येक यूनिक्स मशीन जहाजों – tchrist

+0

@ क्रिसमस: सामान्यता में आपने यह कहा है, यह सिर्फ सादा गलत है। –

+0

अपने अपवादों को नाम दें। – tchrist

2

यदि आप मशीन पर स्थापित प्रोग्राम निष्पादित करना चाहते हैं, तो कुछ भी धड़कता नहीं है। आप हमेशा पर्ल या पायथन से सिस्टम कॉल कर सकते हैं, लेकिन मुझे लगता है कि यह रिटर्न वैल्यू इत्यादि पढ़ने में परेशानी हो सकती है।

और जब से आप जानते हैं कि यह हर समय कहीं भी कहीं भी काम करेगा ...

+0

मुझे नहीं पता था कि पायथन ने 'syscall' का समर्थन किया है, क्योंकि इन पर्ल उदाहरणों से पता चलता है कि पर्ल करता है:' syscall (& SYS_gettimeofday, $ tv, undef)> = 0' या 'syscall (और SYS_setgroups, स्केलर @ न्यूजिड्स, पैक (" i * ", @ न्यूजिड्स))' – tchrist

+0

"सिस्टम" कॉल से मेरा मतलब "खोल में" था। शाब्दिक प्रणाली कॉल नहीं है। मुझे नहीं पता था कि पर्ल ऐसा कर सकता था। – drysdam

+0

मैं शेलिंग आउट करता हूं और एक सिस्कोल को बहुत अलग चीजों के रूप में देखता हूं। एक केवल कुछ उपयोगकर्ता-स्तरीय प्रोग्राम को खोलता है जैसे शेल करता है, जबकि अन्य जाल बिना किसी मुसब्बर या झगड़े के कर्नेल में जाते हैं। सबसे पहले जरूरी कई सिस्को कार्यरत हैं; दूसरा, जरूरी बिल्कुल एक। – tchrist

4

लाभ यह है कि यह वहीं है। जब तक आप पाइथन (या पर्ल) को अपने खोल के रूप में उपयोग नहीं करते हैं, तो एक साधारण लूप करने के लिए एक स्क्रिप्ट लिखना अतिरिक्त काम का एक गुच्छा है।

छोटी, छोटी स्क्रिप्ट्स जो अन्य प्रोग्राम्स को कॉल करती हैं, मैं बैश का उपयोग करूंगा। अगर मैं आउटपुट रखना चाहता हूं, तो बाधाएं अच्छी हैं कि मैं पाइथन तक व्यापार करूंगा।

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

for file in *; do process $file ; done 

जहां process एक कार्यक्रम मैं प्रत्येक फ़ाइल पर चलाना चाहते हैं, या ...

while true; do program_with_a_tendency_to_fail ; done 

अजगर या पर्ल में उन दोनों में से किसी कर रही है overkill है।

वास्तव में एक प्रोग्राम लिखने के लिए जिसे मैं समय के साथ बनाए रखने और उपयोग करने की उम्मीद करता हूं, बैश शायद ही कभी नौकरी के लिए सही उपकरण है। विशेष रूप से अधिकांश आधुनिक इकाइयां पर्ल और पायथन दोनों के साथ आती हैं।

+1

इसे अपने पहले उदाहरण के लिए एक विकल्प (कम टाइपिंग, अधिक [समांतर] (http://www.gnu.org/software/parallel/)): 'एलएस | समांतर प्रक्रिया ' – Sebastian

+2

@ सेबेस्टियन: जादुई! हालांकि मुझे लगता है कि 'समांतर प्रक्रिया - *' करीब है। – nmichaels

+1

एलएस | xargs प्रक्रिया भी उसी तरह काम करेगी, लेकिन इन सभी विधियों में एक बग है: वे रिक्त स्थान या लाइनफ़ीड्स के साथ फ़ाइल नामों के साथ काम नहीं करते हैं। आप चाहते हैं: f में * के लिए; प्रक्रिया "$ एफ"; किया – ijw

1

शैल स्क्रिप्टिंग का लाभ यह है कि यह वैश्विक स्तर पर * ix बक्से पर मौजूद है, और इसमें अपेक्षाकृत स्थिर कोर सेट है जो आप हर जगह चलाने के लिए भरोसा कर सकते हैं। पर्ल और पायथन के साथ आपको चिंता करने की ज़रूरत है कि वे उपलब्ध हैं या नहीं, और यदि ऐसा संस्करण है, क्योंकि उनके जीवनकाल में महत्वपूर्ण वाक्य रचनात्मक असंगतताएं हैं। (विशेष रूप से यदि आप पाइथन 3 और पर्ल 6 शामिल हैं)

शैल स्क्रिप्टिंग का नुकसान बाकी सब कुछ है। शेल स्क्रिप्टिंग भाषाओं में आमतौर पर अभिव्यक्ति, कार्यक्षमता और प्रदर्शन की कमी होती है। और बचने के लिए मजबूत स्ट्रिंग प्रसंस्करण सुविधाओं और पुस्तकालयों के बिना एक भाषा में तारों से एक साथ हैकिंग कमांड लाइनों को हैक करना, सुरक्षा समस्याओं को आमंत्रित करता है। जब तक एक आकर्षक संगतता कारण नहीं है, आपको खोल के साथ जाने की आवश्यकता है, मैं व्यक्तिगत रूप से हर बार एक स्क्रिप्टिंग भाषा के लिए मोटा होगा।

+0

पर्ल 6 अलग निष्पादन योग्य के रूप में स्थापित है, इसलिए आप किसी भी मामले में पर्ल 5 का उपयोग कर सकते हैं। –

16

दो फायदे दिमाग में आते हैं:

  • सरलता: सब अद्भुत linux उपकरणों के लिए सीधी पहुँच wc, ls, cat, grep, sed ... आदि क्यों लगातार अजगर के subprocess मॉड्यूल का उपयोग?
  • मैं gnu parallel का उपयोग करने के लिए तेजी से शौकीन हूं, जिसके साथ आप समानांतर में अपनी बैश स्क्रिप्ट निष्पादित कर सकते हैं। जैसे आदमी पृष्ठ से, बैच समानांतर में निर्देशिका में सभी jpgs के अंगूठे बनाने के लिए:

    ls *.jpg | parallel convert -geometry 120 {} thumb_{}

वैसे, मैं आमतौर पर मेरी पार्टी लिपियों में कुछ अजगर कॉल (जैसे की साजिश रचने के लिए) है। कार्य के लिए जो भी सबसे अच्छा है उसका प्रयोग करें!

4

बैश एक कमांड दुभाषिया के रूप में एक भाषा नहीं है जिसे मौत के लिए हैक किया गया है ताकि यह उन चीजों की अनुमति दे सके जो इसे एक स्क्रिप्टिंग भाषा की तरह दिखते हैं। यह सबसे आसान 1-5 लाइन एक-ऑफ कार्यों के लिए बहुत अच्छा है, लेकिन चीजें जो पार्ल या पायथन में सरणी हेरफेर जैसी सरल हैं, वे बैश में बहुत बदसूरत हैं। मैं भी पाते हैं कि पार्टी अंगूठे का दो महत्वपूर्ण नियम पारित करने के लिए नहीं जाता:

  1. 6-महीने के नियम है, जो आप आसानी से उद्देश्य और एक स्क्रिप्ट के बुनियादी यांत्रिकी आप ने लिखा लेकिन हेवन 'विचार करने के लिए सक्षम होना चाहिए कहते हैं टी 6 महीने में देखा।

  2. 'डब्ल्यूटीएफ प्रति मिनट' नियम। हर किसी की सीमा है, और मेरा बहुत छोटा है। एक बार जब मैं 3 डब्ल्यूटीएफ/मिनट तक पहुंच जाता हूं, तो मैं कहीं और देख रहा हूं। (: मैं अजगर में लगभग 100% कोड त्याग)

पर्ल और अजगर की तरह पटकथा भाषाओं में 'बाहर बमबारी' का सवाल है, मुझे लगता है कि मैं लगभग यह, Fwiw करने की ज़रूरत कभी नहीं पाते हैं। पाइथन ओएस और शिल मॉड्यूल में मुझे अधिकतर समय की आवश्यकता होती है, और टैरिफाइल, जीजीआईपी फाइलों, ज़िप फाइलों आदि को संभालने के लिए अंतर्निहित मॉड्यूल हैं। एक ग्लोब मॉड्यूल, एक एफएनएमच मॉड्यूल है ... बहुत कुछ है वहाँ सामान की। यदि आप किसी चीज में आते हैं तो आपको समानांतर करने की आवश्यकता होती है, फिर अपने कोड को एक स्तर पर इंडेंट करें, इसे 'रन()' विधि में रखें, उसे उस वर्ग में रखें जो थ्रेडिंग को बढ़ाता है। थ्रेड या मल्टीप्रोसेसिंग। प्रोसेस, उनमें से कई को तत्काल आप चाहते हैं, प्रत्येक पर 'प्रारंभ()' को बुलाओ। आम तौर पर समानांतर निष्पादन प्राप्त करने के लिए 5 मिनट से कम।

शुभकामनाएं। उम्मीद है की यह मदद करेगा।

+0

मैं सहमत हूं, सिवाय इसके कि खोल से पर्ल पर स्विच करने के लिए मेरी व्यक्तिगत सीमा 10-20 लाइनों पर है। – reinierpost

+0

बोर्न शेल (बैश को अनदेखा करना - आपको आम तौर पर शेल स्क्रिप्ट लिखने के लिए बैश एक्सटेंशन का सहारा लेना नहीं पड़ता है) को स्क्रिप्टिंग भाषा होने के लिए 'हैक किया गया' नहीं है - यह शायद 30 साल पुराना है और मूल प्रोग्रामिंग सुविधाएं जैसे लूप, परिस्थितियां और कार्य शुरू से ही थे। – ijw

4

बड़ी परियोजनाओं के लिए पर्ल जैसी भाषा का उपयोग करें।

कुछ चीजें हैं जो आप केवल बाश में कर सकते हैं (उदाहरण के लिए, कॉलिंग पर्यावरण को बदलें (जब एक स्क्रिप्ट को चलाने के बजाए सोर्स किया जाता है)। इसके अलावा, शैल स्क्रिप्टिंग आम है। मूल बातें सीखना और सीखना फायदेमंद है उपलब्ध डॉक्स आगे बढ़ने का तरीका।

प्लस जब एक खोल में अच्छी तरह से जानते हुए भी (एक कांटा बमबारी सिस्टम पर अपने बेकन बचा सकता है जहां आप किसी भी नई प्रक्रियाओं शुरू नहीं कर सकते बार देखते हैं, या अगर /usr/bin और या /usr/local/bin माउंट करने में विफल)

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

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