पाइथन की तुलना में शेल स्क्रिप्टिंग की ताकत [बंद]


94

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

शेल स्क्रिप्टिंग की ताकत क्या है जो इसे पायथन की तुलना में एक अनिवार्य उपकरण बनाती है?

मैं पेशे से एक सिस्टम प्रशासन नहीं हूं, लेकिन मैं घरेलू उपयोगकर्ताओं के लिए लिनक्स सिस्टम स्थापित करने में दिलचस्पी रखता हूं, इसलिए मुझे लगता है कि शेल स्क्रिप्टिंग सीखना आवश्यक हो सकता है।

जवाबों:


82
  • शेल स्क्रिप्टिंग में I / O पुनर्निर्देशन के लिए सरल सूचनाएं हैं।
  • शेल में मौजूदा कार्यक्रमों से पाइपलाइन बनाना सरल है।
  • शेल स्क्रिप्टिंग पूरे कार्यक्रमों का पुन: उपयोग करता है।
  • शेल सार्वभौमिक रूप से उपलब्ध है (यूनिक्स जैसी किसी भी चीज़ पर) - पायथन आवश्यक रूप से स्थापित नहीं है।

'यह सच है कि आप पायथन में वह सब कुछ कर सकते हैं जो आप खोल में कर सकते हैं; 'टिस यह भी सच है कि पायथन में आसान चीजें हैं जो शेल में कठिन हैं (जैसे कि ऐसी चीजें हैं जो शेल में आसान हैं लेकिन पायथन में कठिन हैं)। दोनों को जानना दीर्घकालिक में सबसे अच्छा होगा।


16
1 और 2, अच्छे अंक। # 3 एक कमजोरी है, क्योंकि यह बहुत अधिक ओवरहेड की ओर जाता है जो पायथन से बच सकता है। # 4 काफी हद तक असत्य हो सकता है। पायथन अब अधिकांश लिनक्स डिस्ट्रोस का हिस्सा है।
एस.लॉट

1
@Svante: "परीक्षण" और "expr" जैसी कमांड का उपयोग करके कई ऑपरेशन करने के लिए एक सरल शेल लूप लिखें और "OS" मॉड्यूल का उपयोग करने वाले पायथन स्क्रिप्ट के साथ रन बार की तुलना करें। परीक्षण और expr जैसी कमानों में अक्सर असली काम करने के लिए एक उपप्रकार को शामिल करना शामिल होता है।
S.Lott

2
मैं बिंदु 3 को एक बड़े लाभ के रूप में देखता हूं, एक नुकसान के रूप में नहीं। उदाहरण के लिए, कन्वर्ट प्रोग्राम के साथ छवियों से भरी निर्देशिका का आकार बदलने पर विचार करें।
ग्लेन

7
# 4 के संबंध में भी उल्लेखनीय है कि bashशेल विशेष रूप से सभी लिनक्स डिस्ट्रो पर सार्वभौमिक रूप से उपलब्ध नहीं है, विशेष रूप से एम्बेडेड सिस्टम के लिए, और अन्य जो busyboxनिष्पादन योग्य चल रहे हैं । स्क्रिप्ट जो बॉर्न शेल को लक्षित करती है, जिसके साथ bashपीछे की ओर संगत है, सभी POSIX-compliant सिस्टम पर चलेगा, हालांकि यह भाषा उस पर लागू होने की तुलना में बहुत अधिक प्रतिबंधित है bash
intuited

5
@intuited: eval "$ (इतिहास 2 | सिर -1 | perl -pe 's / ((? <= जो है) अधिक शायद / कम से कम /')"; इतिहास $ -d (| सिर -1 | इतिहास 2 sed 's / ^ \ s * ([0-9] \ +) / \ 1 /')
intuited

54

"शेल स्क्रिप्टिंग की कौन सी ताकतें हैं जो इसे पायथन की तुलना में एक अनिवार्य उपकरण बनाती हैं?"

खोल अपरिहार्य नहीं है। आपको क्या लगता है कि इतने सारे क्यों हैं? bash, tsh, csh, sh, इत्यादि, आदि।

अजगर है एक खोल। वह नहीं जिसे आप सभी कमांड चलाने के लिए उपयोग करेंगे , लेकिन स्क्रिप्टिंग के लिए, यह आदर्श है।

पायथन सभी लिनक्स डिस्ट्रो का अधिक या कम मानक हिस्सा है।

अधिक पारंपरिक गोले बहुत सारे काम करते हैं।

  1. उनके पास कमांड चलाने के लिए एक आसान यूजर इंटरफेस है। इसमें एक-लाइन कमांड शामिल है जहां शेल आपके PATH को खोजता है, अनुरोधित प्रोग्राम को कांटे और निष्पादित करता है। इसमें पाइपलाइन, अनुक्रम और समवर्ती कार्यक्रम (उपयोग करना ;, |और &) के साथ-साथ कुछ पुनर्निर्देशन (उपयोग करना >और <) भी शामिल हैं।

  2. स्क्रिप्ट चलाने के लिए उनके पास एक छोटी प्रोग्रामिंग-भाषा जैसी क्षमता है। यह भाषा उपयोग करने में कठिन है और बेहद अक्षम है। इस भाषा में अधिकांश कथनों में एक या एक से अधिक अतिरिक्त प्रक्रियाएँ, समय और स्मृति को बर्बाद करने की आवश्यकता होती है।

शेल से प्रोग्राम चलाना, एक फ़ाइल में stderr को पुनर्निर्देशित करना और उस तरह की बात अच्छी है। खोल में करो।

लगभग सब कुछ और अधिक कुशलता से और अधिक स्पष्ट रूप से पायथन लिपि के रूप में किया जा सकता है।

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


1
@intuited। ए) अलग-अलग गोले का प्रसार "शेल" में आने वाली सुविधाओं की संख्या से जुड़ा हुआ है; यह आवश्यक भूमिका नहीं है, लेकिन यह सभी सुविधाओं के लिए पकड़ है। बी) अजगर दुभाषिया एक उचित यूनिक्स खोल है, यह # का उपयोग करता है सी) एक "सरल" शेल ifस्टेटमेंट में अक्सर testप्रोग्राम चलाना शामिल होता है । शेल सभी प्रकार से एक क्रिम प्रोग्रामिंग भाषा है।
12.10

4
@S। लोट: ऐसा लगता है कि कुछ अर्थ संबंधी विसंगति यहां सर्किटरी में है। एक UNIX शेल की मेरी परिभाषा एक दुभाषिया होगी जिसकी भाषा मुख्य रूप से एक उच्च स्तर पर, एक UNIX प्रणाली के संचालन को नियंत्रित करने के लिए तैयार है। इस परिभाषा के अनुसार, कुछ प्रकार का शेल निश्चित रूप से एक यूनिक्स प्रणाली के संचालन के लिए आवश्यक है, और पायथन योग्य नहीं है। आप उस शब्द को कैसे परिभाषित करेंगे?
intuited

1
@ S.Lott: मैं पारंपरिक खोल स्क्रिप्टिंग में उपयोग किए जाने वाले वाक्यविन्यास का बहुत बड़ा प्रशंसक नहीं हूं, लेकिन मुझे यह काफी उपयोगी लगता है, और कई स्थितियों में उचित है जहां मुख्य लक्ष्य प्रक्रियाओं और उनके उत्पादन के प्रवाह को नियंत्रित करना है। इसके लिए अक्सर निर्णय लेने और पुनरावृति की आवश्यकता होती है। आधुनिक गोले ( bashकम से कम) के पास निर्णय लेने की क्षमता को संभालने के लिए भवन हैं (जैसे अधिक बहुमुखी निर्माणों के अलावा, testयह एक bashबिलिन है)। यह निश्चित रूप से अपनी कमजोरियों, लेकिन यह भी अपनी ताकत है। यह विस्तार से सीखने लायक भी है क्योंकि यह अन्य प्रकार की भाषाओं की तुलना में बहुत अलग प्रतिमान है।
intuited

1
@intuited: "यह काफी उपयोगी है" आपके कौशल को सलाम है, न कि क्रमी भाषा को। लोगों द्वारा कुशल के रूप में नहीं पायथन अधिक उपयोगी हो सकता है।
S.Lott

3
@ एस.लॉट: दिलचस्प है, आपके पास आई से बहुत अलग दर्शन है। मुझे लगता है कि डिजाइन और संचालन मूल रूप से मुर्गियां और अंडे हैं। यह कहना है कि एक शेल स्क्रिप्ट एक प्रोग्राम है जो प्रोग्राम चलाता है। उन कार्यक्रमों में से कई शुरू में तेजी से जटिल खोल स्क्रिप्ट के रूप में लागू किए गए थे। कुछ बिंदु पर यह सार्थक हो गया, संभवतः दक्षता के रूप में उतनी ही विशिष्टता के लिए, उनमें से कुछ को सी में फिर से लिखा जा सकता है, और बाद में, पायथन। उदाहरण के लिए: कुछ बिंदु पर cat "$1" | ssh "$2" "cat - >\"$1\""बेगट scp। वे जानते थे कि इसे कैसे डिजाइन करना सबसे अच्छा है क्योंकि वे पहले से ही इसका इस्तेमाल कर रहे थे।
intuited

31

खोल सामान्य और सरल क्रियाओं को वास्तव में सरल बनाता है, अधिक जटिल चीजों को बहुत अधिक जटिल बनाने की कीमत पर।

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

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


14

शेल स्क्रिप्ट के साथ ऐसा कुछ भी नहीं है जो आप अजगर के साथ नहीं कर सकते। शेल स्क्रिप्ट का बड़ा फायदा यह है कि आप शेल का उपयोग करते समय उसी तरह के कमांड का उपयोग करते हैं, इसलिए यदि आप एक भारी शेल उपयोगकर्ता हैं, तो शेल स्क्रिप्टिंग आपके बिंदु को स्वचालित करने के लिए एक बहुत ही त्वरित और आसान तरीका बन जाएगा। ।

मुझे अजगर की तुलना में शेल स्क्रिप्ट में डेटा के पाइप से निपटना आसान लगता है, हालांकि यह अजगर से बिल्कुल संभव है।

और, अंत में, आपको शेल स्क्रिप्ट्स को चलाने के लिए एक अतिरिक्त इंटरपरेटर को फायर करने की ज़रूरत नहीं है, जो आपको बहुत छोटा देता है, लेकिन कभी-कभी ध्यान देने योग्य गति और मेमोरी उपयोग लाभ।

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


9

किसी को शेल स्क्रिप्टिंग सीखने की ज़रूरत नहीं है, क्योंकि पिछले सभी उत्तर इंगित करते हैं; लेकिन सीखना कभी भी बुरी बात नहीं है। यह वास्तव में व्यक्तिगत प्राथमिकताओं का सवाल है। किसी और के लिए यह बताना बहुत कठिन है कि आपके समय का मूल्य क्या है और क्या नहीं।

अधिकांश प्रोग्रामर पाते हैं कि हर बार नई भाषाओं को सीखना आसान हो जाता है। (यही बात प्राकृतिक भाषाओं के बारे में भी काफी हद तक सही है।) और पहले जो आप शुरू करते हैं, वह बेहतर है।

प्लस: एक भाषा सीखी जाने से आप संपूर्ण ज्ञान और परिचितता की स्थिति से अपनी सीमाओं को असाधारण रूप से भंग कर सकते हैं। यह शायद आपको नहीं मिलेगा, लेकिन आप अपने साथियों से बीयर कमा सकते हैं!


8

मैं पिछले उत्तरों में से अधिकांश से सहमत हूं। मैं शेल कमांड को फाइलसिस्टम-ओरिएंटेड टास्क (कॉपी और मूव फाइल, जीआरपी, आदि) करने के लिए सबसे उपयुक्त मानता हूं। शेल बेहतर है, मेरी राय में, अगर आपको फ़ाइल को पढ़ना और लिखना है, क्योंकि एक ही >>file.txtपुनर्निर्देशन तुरंत जरूरत के बजाय, कहना file=open('file.txt','a'); file.write(), इत्यादि को दर्ज करना है।

वर्तमान में, अपने व्यक्तिगत उपयोग के लिए, मैं दोनों को मिलाता हूं, एक अजगर स्क्रिप्ट का निर्माण करता हूं और हर बार कुछ क्रियाओं को अजगर की तुलना में खोल में os.system ('कमांड') या os.popen ('कमांड') को कॉल करना आसान होता है।


6

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

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

शेल में कुछ बहुत शक्तिशाली विशेषताएं हैं; पाइपलाइनें वास्तव में एक दिलचस्प नियंत्रण निर्माण हैं जो केवल शेल के मूल निवासी हैं, जहां तक ​​मुझे पता है।


5

पायथन की शेल स्क्रिप्ट चुनते समय विचार करने वाली एक और बात पायथन संस्करण है जो लक्ष्य मशीनों पर चल रही होगी। RHEL5 (एक नाम देने के लिए) लंबे समय तक रहने वाला है। RHEL5 पायथन 2.4 के साथ फंस गया है। बहुत सारे अच्छे पुस्तकालय हैं जो कि पायथन पोस्ट-2.4 में जोड़े गए कार्यक्षमता पर निर्भर करते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.