व्याख्या की गई प्रोग्रामिंग भाषाओं पर शेल स्क्रिप्ट का क्या फायदा है? [बन्द है]


15

(मुझे यकीन नहीं है कि यह एक उपयुक्त प्रश्न है)

शेल स्क्रिप्ट, जैसे कि उन में लिखी गई bash, कई चीजें कर सकती हैं। वे यूनिक्स कार्यक्रमों को कॉल कर सकते हैं, उनके आउटपुट को पाइप कर सकते हैं, I / O से / फ़ाइलों तक, नियंत्रण प्रवाह, जाँच सकते हैं कि क्या कोई फ़ाइल मौजूद है, आदि।

लेकिन एक आधुनिक प्रोग्रामिंग भाषा, जैसे, pythonऔर ruby, ये चीजें भी कर सकती हैं। और, वे (मुझे लगता है) अधिक पठनीय और बनाए रखने योग्य हैं।

bashव्यापक प्रसार अपनाने का आनंद लेता है। लेकिन कई वितरणों ने pythonदुभाषिया भी स्थापित किया है।

तो शेल की स्क्रिप्ट का क्या फायदा? अगर मैं लिख सकता था python, rubyया perl, क्या यह सीखने लायक है bash?


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

जवाबों:


30

गोले में फ़ाइलों के साथ काम करने और एक कार्यक्रम से दूसरे में डेटा प्राप्त करने (डेटा पाठ है) के लिए विशिष्ट विशेषताएं हैं। उन कार्यों के लिए, शेल स्क्रिप्ट पाइथन जैसी स्क्रिप्टिंग भाषा की तुलना में कम बोझिल हो सकती है।

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

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

#!/usr/bin/sh
mv *.png $1

यहाँ एक पायथन संस्करण है।

#!/usr/bin/python
import sys, shutil, glob
for filename in glob.iglob("./*.png"):
    shutil.move(filename, sys.argv[1])

आप देखेंगे:

  • बैश लिपि एक तीसरी है जब तक कि आप पंक्तियों को गिनते हैं जब तक कि आप (शेबंग लाइन को छोड़कर) - चरित्र की गिनती से भी कम
  • पायथन लिपि को आयात करने के लिए तीन पुस्तकालयों की आवश्यकता होती है, जबकि इस कार्य के लिए आपको जो कुछ भी चाहिए वह मूल रूप से बैश में उपलब्ध है
  • पायथन लिपि को फाइलों को स्थानांतरित करने के लिए एक स्पष्ट लूप की आवश्यकता होती है, जबकि यह mvबैश में कमांड के शब्दार्थ का हिस्सा होता है
  • बैश स्क्रिप्ट तेजी से चल सकती है - आप शायद इसे बैश से मंगवाएंगे, और आप इसका उपयोग कर सकते हैं source इसे शेल के एक ही उदाहरण में चलाने के लिए
  • glob.iglob("./*.png") सिर्फ कहने के लिए एक कौर है *.png

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

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

मैंने इसे बैश में किया क्योंकि यह हमारे बिल्ड सिस्टम का हिस्सा था जो पहले से ही बैश में लिखा था। जैसा कि आप शायद सोच रहे हैं, ठीक से प्राप्त करना उतना ही कठिन था। पाइथन में लिखने में बहुत कम समय लगा होगा और शायद स्पष्ट भी हो गया होगा।

संक्षेप में: विभिन्न भाषाओं को विभिन्न प्रकार के कार्यों के लिए डिज़ाइन किया गया है; आपके लिए उपलब्ध भाषा को चुनें जो हाथ में काम के लिए सबसे उपयुक्त है।


आप perl # / usr / bin / perl में mv *.png $1टिप्पणी नहीं कर सकते (टिप्पणियाँ स्वरूपण को बनाए नहीं रखते हैं) लेकिन पर्ल के साथ आप उच्च स्तरीय भाषा सुविधाओं का भी उपयोग कर सकते हैं।
पोमा

19

मौजूदा उत्तर भी मान्य हैं, लेकिन एक कारण है कि किसी ने अभी तक उल्लेख नहीं किया है: क्योंकि यह वहां होगा।

किसी भी दिए गए * निक्स इंस्टॉल को वैकल्पिक पैकेज के कुछ सेट के साथ किया जाता है जो लोड हो सकता है या नहीं हो सकता है, और सभी सिस्टम में पायथन या पर्ल या रूबी नहीं होंगे। लेकिन अगर सिस्टम से किसी भी तरह की इंटरैक्टिव क्षमता की उम्मीद की जाती है, तो इसका एक खोल होगा। इसका मतलब यह है कि शेल स्क्रिप्ट सर्वर से प्रोग्रामर के डेस्कटॉप से ​​लेकर सचिवीय पतले-क्लाइंट डेस्कटॉप से ​​लेकर एम्बेडेड डिवाइस तक, किसी भी सिस्टम पर, जो एक राइट फाइल सिस्टम और बैश कमांड लाइन को सपोर्ट करता है, पर काम करेगा।

किसी ऐसे व्यक्ति के लिए जो कभी भी एक सुसंगत सर्वर वातावरण में काम करता है, यह एक ऐसी चीज है जिसे प्रदान किया जा सकता है, और यह इतना महत्वपूर्ण नहीं है। अधिक विविध वातावरण में काम करने वाले किसी व्यक्ति के लिए, इसे अनदेखा नहीं किया जाना चाहिए।


9

आपके प्रश्न का एक महत्वपूर्ण हिस्सा यहाँ उत्तर दिया गया है:

स्क्रिप्टिंग भाषाएं (जैसे पर्ल, पायथन, रूबी) शेल भाषाओं के रूप में उपयुक्त क्यों नहीं हैं?

यहाँ उस प्रश्न के मेरे उत्तर का एक अंश है :

कुछ मतभेद हैं जिनके बारे में मैं सोच सकता हूं; यहाँ केवल विचारधारा, कोई विशेष क्रम में नहीं:

  1. पायथन एंड कंपनी को स्क्रिप्टिंग के लिए अच्छा बनाया गया है। बैश एंड कंपनी को स्क्रिप्टिंग में ही अच्छा माना जाता है, जिसमें कोई समझौता नहीं है। IOW: पायथन को स्क्रिप्टिंग और गैर-स्क्रिप्टिंग दोनों में अच्छा बनाया गया है, बैश केवल स्क्रिप्टिंग के बारे में परवाह करता है।

  2. बैश एंड कंपनी अप्राप्त है, पायथन एंड कंपनी दृढ़ता से टाइप की जाती है, जिसका अर्थ है कि संख्या 123, स्ट्रिंग 123और फ़ाइल 123काफी भिन्न है। वे, हालांकि, सांख्यिकीय रूप से टाइप नहीं किए गए हैं, जिसका अर्थ है कि उन्हें अलग रखने के लिए उनके लिए अलग-अलग शाब्दिक होने की आवश्यकता है। उदाहरण:

    • रूबी: 123(संख्या), बैश:123
    • रूबी: '123'(स्ट्रिंग), बैश:123
    • रूबी: /123/(regexp), बैश:123
    • रूबी: File.open('123')(फ़ाइल), बैश:123
    • रूबी: IO.open('123')(फाइल डिस्क्रिप्टर), बैश:123
    • रूबी: URI.parse('123')(URI), बैश:123
    • रूबी: `123`(कमांड), बैश:123
  3. अजगर एंड कंपनी पैमाने पर करने के तैयार कर रहे हैं अप , 10000, 100000 करने के लिए भी हो सकता है 1000000 लाइन कार्यक्रम, बैश एंड कंपनी पैमाने पर करने के तैयार कर रहे हैं नीचे 10 चरित्र कार्यक्रम।

  4. बैश एंड कंपनी में, फ़ाइलें, निर्देशिकाएं, फ़ाइल विवरणक, प्रक्रियाएं सभी प्रथम श्रेणी की वस्तुएँ हैं, पायथन में, केवल पायथन ऑब्जेक्ट्स प्रथम श्रेणी के हैं, यदि आप फ़ाइलों, निर्देशिकाओं आदि में हेरफेर करना चाहते हैं, तो आपको उन्हें एक में लपेटना होगा। पहले पायथन ऑब्जेक्ट।

  5. शेल प्रोग्रामिंग मूल रूप से डेटाफ्लो प्रोग्रामिंग है। किसी को भी इस बात का अहसास नहीं है कि गोले लिखने वाले लोग भी नहीं हैं, लेकिन यह पता चला है कि गोले उस पर काफी अच्छे हैं, और सामान्य-उद्देश्य वाली भाषाएँ इतनी नहीं हैं। सामान्य-प्रयोजन प्रोग्रामिंग दुनिया में, डेटाफ़्लो को ज्यादातर एक संगामिति मॉडल के रूप में देखा जाता है, इतना नहीं कि एक प्रोग्रामिंग प्रतिमान।

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


टूटा हुआ लिंक: यह प्रश्न (और उत्तर) आपके पास अब कहां है? या यह सब उपयोगी था जो यहाँ कॉपी किया गया था?
वुल्फ

1
@Wolf: जाहिर तौर पर, इसे लगभग तीन साल बाद ऑफ-टॉपिक होने के लिए हटा दिया गया था। बदकिस्मती से।
जॉर्ग डब्ल्यू मित्तग

1
यहाँ उस प्रश्न का एक संग्रहीत संस्करण है: web.archive.org/web/2014052803535940/http://stackoverflow.com/…
waldyrious

1

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

दूसरी ओर, यदि आपके प्रोग्रामिंग कार्य में नियंत्रण संरचनाओं (यदि / फिर / अन्यथा), पुनरावृत्त संरचनाओं (लूपिंग), डेटाबेस और फ़ाइल I / O, आदि की आवश्यकता है, तो यह संभवतः अधिक सक्षम के लिए बेहतर अनुकूल है एक शेल स्क्रिप्ट की तुलना में प्रोग्रामिंग भाषा।

मुझे लगता है कि अंगूठे का एक अच्छा नियम है:

automatingSimpleTask ? shellScript() : programmingLanguage();

2
यह shellScript() if automatingSimpleTask else programmingLanguage() योग्य नहीं होना चाहिए
गहूआ

1
@gahooa haha ​​दिखाता है कि मैं किस बाड़ के किनारे हूँ!
CFL_Jeff

1

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


0

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

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


0

शेल स्क्रिप्टिंग है एक व्याख्या की प्रोग्रामिंग भाषा। यहाँ कुछ कारण बताए गए हैं कि मैंने पर्ल या अजगर या किसी अन्य स्क्रिप्टिंग भाषा के बजाय बैश में स्क्रिप्ट लिखने का विकल्प क्यों चुना:

हर जगह काम करता है : अधिक जटिल दुभाषिया हमेशा उपलब्ध नहीं हो सकते हैं, जैसे कि सिस्टम स्टार्टअप के दौरान या एम्बेडेड सिस्टम पर। बैश व्यस्त बॉक्स में भी उपलब्ध है।

कमांड लाइन पर काम करता है : यदि आप शेल-स्क्रिप्टिंग के अच्छे जानकार हैं, तो आप कमांड लाइन पर एड-हॉक स्क्रिप्ट में जटिल चीजों को करने के लिए उन कौशल का उपयोग कर सकते हैं। मैं इस कौशल का उपयोग रोजाना एक sysadmin की तरह करता हूं।

अन्य प्रोग्राम को कॉल करने वाले प्रोग्राम लिखने में आसान: यदि आप जो करने की कोशिश कर रहे हैं वह दिलचस्प तरीकों से एक साथ कई मौजूदा कार्यक्रमों की श्रृंखला है, तो उच्च-स्तरीय भाषा की तुलना में शेल स्क्रिप्ट में करना सरल हो सकता है।

यदि प्रोग्राम 30 लाइन या उससे कम है, तो मैं आमतौर पर इसे शेल स्क्रिप्टिंग का उपयोग करके लिखूंगा। यदि किसी जटिल हेरफेर या जटिल या विश्लेषण से निपटने के लिए है, तो मैं इसे अजगर या पर्ल का उपयोग करूँगा।


-1

आपको कॉफ़ीस्क्रिप्ट पर एक नज़र रखना चाहिए। उनके शब्द:

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

CoffeeScript का सुनहरा नियम है: "यह सिर्फ जावास्क्रिप्ट है"।

खैर ... यहां आता है सुपर-बिगिनर जवाब।

पिछले 6 महीनों के लिए एक ऑटो-लर्निंग शुरुआतकर्ता के रूप में, और अंतिम दिनों में सी, सी ++, जावास्क्रिप्ट, और अधिक बैशस्क्रिप्ट का थोड़ा सा स्वाद लेना ... मैं आपको बता सकता हूं:

शेल स्क्रिप्ट, जैसे बैश में लिखी गई, कई चीजें कर सकती हैं। वे यूनिक्स कार्यक्रमों को कॉल कर सकते हैं, उनके आउटपुट को पाइप कर सकते हैं, I / O से / फ़ाइलों तक, नियंत्रण प्रवाह, जाँच सकते हैं कि क्या कोई फ़ाइल मौजूद है, आदि।

और यह सरल शानदार नहीं है! ? छोरों और चर? वाह!

अजगर और माणिक, ये काम भी कर सकते हैं। और, वे (मुझे लगता है) अधिक पठनीय और बनाए रखने योग्य हैं।

कृपया, मुझे बताएं कि आप इसे कहाँ देखते हैं? मैं में bashscript लिखा एडिट भी में Geany और मैं स्वरूपित कर सकते हैं, (टैब?) और मैं अन्य भाषाओं पर तुलना में प्रकाश bashscript का उपयोग कर की गति में मेरी कोड पढ़ें।

क्या इस भाषा में ऑर्डर रखने के लिए अन्य उपकरण हैं? मुझे पता है कि ऑब्जेक्ट-ओरिएंटेड कोड को बहुत सहेजता है, लेकिन ... लोग कहते हैं कि बैशस्क्रिप्ट भी OO है! वाह 2! यही मेरी बात है। जा रहा हूँ:

एक स्क्रिप्ट के लाभ

इस सवाल के अंदर है: यह कैसे करना है कि यह बशदमन पर्ल या फाइटन या रूबी में क्या कर सकता है? यह आसान है?

( बश्दमनथिंग = एक्सडॉटूल )


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