यूनिक्स में बोलते हैं कि एक शेल स्क्रिप्ट और एक निष्पादन योग्य के बीच क्या अंतर है?


9

मैंने इस साइट पर यह प्रश्न देखा है और इसने मुझे यह प्रश्न पूछने के लिए प्रेरित किया। मैं यूनिक्स में जानना चाहता हूं कि एक निष्पादन योग्य और शेल स्क्रिप्ट में क्या अंतर है?

जवाबों:


12

एक निष्पादन योग्य निष्पादन योग्य सेट के साथ किसी भी फ़ाइल को संदर्भित करता है जिसे निष्पादित किया जा सकता है (भले ही कार्यक्रम के वास्तविक चलने में त्रुटियां हों)।

एक शेल स्क्रिप्ट एक विशिष्ट प्रकार का निष्पादन योग्य है जिसका उद्देश्य #!एक व्याख्याकार को निर्दिष्ट करने के लिए निर्देश का उपयोग करके शेल द्वारा व्याख्या किया जाना है ।


12

एक स्क्रिप्ट एक फाइल है जो:

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

एक शेल स्क्रिप्ट एक स्क्रिप्ट है जिसका दुभाषिया एक खोल है । यूनिक्स दुनिया में, "शेल" गोले के परिवार को संदर्भित करता है जो बॉर्न शेल से मिलता जुलता है ; आधुनिक ऐसे गोले (राख, बाश, क्श, ज़श, ...) पोसिक्स शैल मानक के अनुरूप हैं । आमतौर पर, शब्द "शेल" में csh, tsh, मछली, जैसे अन्य कमांड दुभाषिए शामिल हो सकते हैं ...


एक निष्पादन योग्य कोई फ़ाइल है जिसे निष्पादित किया जा सकता है। प्रभावी रूप से निष्पादन योग्य होने के लिए, एक फ़ाइल में दो गुण होने चाहिए:

  • उपयोगकर्ता को इसे निष्पादित करने की अनुमति होनी चाहिए। इसे कमांड के साथ देखा जा सकता है ls -l: xचरित्र को अनुमति कॉलम में मौजूद होना चाहिए।
  • फ़ाइल का प्रारूप एक होना चाहिए जिसे सिस्टम निष्पादन योग्य के रूप में पहचानता है। निष्पादन योग्य स्वरूपों को कई श्रेणियों में विभाजित किया जा सकता है:

    • ऑपरेटिंग सिस्टम के बाइनरी एक्ज़ीक्यूटेबल लेआउट के अनुसार आयोजित किए गए मशीन कोड से मिलकर, मूल निष्पादन योग्य। अधिकांश आधुनिक यूनिक्स सिस्टम अपने मूल निष्पादन के लिए ईएलएफ प्रारूप का उपयोग करते हैं ।
    • स्क्रिप्ट। एक निष्पादन योग्य स्क्रिप्ट एक फाइल होती है जो एक शेलबैंग लाइन से शुरू होती है , जिसमें #!एक फाइल के लिए एक पथ के बाद दो अक्षर शामिल होते हैं । ऐसी फ़ाइल को निष्पादित करने के लिए, कर्नेल इंटरप्रेटर प्रोग्राम को निष्पादित करता है और इसे एक तर्क के रूप में स्क्रिप्ट के लिए मार्ग देता है।
    • संभवतः सिस्टम के आधार पर अन्य प्रारूप। उदाहरण के लिए, लिनक्स binfmt_misc सुविधा के माध्यम से मनमाने फ़ाइल स्वरूपों को पंजीकृत कर सकता है । यह जावा बाइटकोड फ़ाइलों को एक पंजीकृत जेवीएम , विंडोज के निष्पादन के माध्यम से शराब , आदि के माध्यम से निष्पादित करने की अनुमति देता है ।

ध्यान दें कि एक निष्पादन योग्य होना सिस्टम पर निर्भर है। उदाहरण के लिए, एक amd64 लिनक्स बाइनरी amd64 लिनक्स सिस्टम पर निष्पादन योग्य है, लेकिन 32-बिट सिस्टम पर नहीं। एंड्रॉइड के लिए एक बाइनरी एक सामान्य लिनक्स इंस्टॉलेशन पर निष्पादन योग्य नहीं है। एक विंडोज़ निष्पादन योग्य केवल लिनक्स पर निष्पादन योग्य है यदि वाइन मौजूद है। #!/usr/local/bin/rubyयदि कोई प्रोग्राम वहां से शुरू होता है तो केवल एक निष्पादन योग्य होता है /usr/local/bin/ruby


एक शेल स्क्रिप्ट आमतौर पर निष्पादन योग्य होती है। लेकिन यह गैर-निष्पादन योग्य हो सकता है, अगर आपके पास इसे निष्पादित करने की अनुमति नहीं है। आप अभी भी व्याख्याकार (उदाहरण के लिए bash /path/to/script) को स्पष्ट रूप से पारित करके इसकी व्याख्या कर सकते हैं - "इसकी व्याख्या की है" यह "निष्पादित" कहने का एक फैंसी तरीका है।


2

खोल स्क्रिप्ट:

एक शेल स्क्रिप्ट कमांड की एक श्रृंखला है जो एक शेल (आमतौर पर श या श-संगत शेल, कभी-कभी एक और) द्वारा व्याख्या की जाएगी।

स्क्रिप्ट नाम, लेकिन ".sh" या ".bash" या ".csh" आदि में अंत करने की आवश्यकता नहीं है (शेल द्वारा दिए गए संकेत के रूप में इसे लॉन्च किया जाना चाहिए)।

स्पष्टता के लिए मैं यह मानूंगा: कि स्क्रिप्ट का नाम है script, और इसे खोल दिया जाना चाहिए bash

शेल में इसे लॉन्च करने का एक विशिष्ट तरीका तब होगा: bash /absolute/path/to/the/scriptया bash ./relative/path/to/the/script। इस तरह, इसे निष्पादन योग्य बिट सेट करने की आवश्यकता नहीं है, क्योंकि यह केवल बैश द्वारा पढ़ा जाता है, जो तब सामग्री को निष्पादित करता है।

यह कर सकते हैं भी सेट किया जा + x (निष्पादन) के साथ अपने वर्तमान खोल सत्र से सीधे शुरू करने के लिए अनुमति देने के लिए: / पूर्ण / path / to / / लिपि (या ./relative/path/to/the/script)। खबरदार: डिफ़ॉल्ट रूप से, जब उस तरह से लॉन्च किया जाता है, तो यह आपके द्वारा टाइप किए गए शेल के माध्यम से या पॉज़िक्स शेल (व्यवहार ओएस निर्भर है) के माध्यम से लॉन्च किया जाता है, इसलिए संभवतः यह वह शेल नहीं हो सकता है जिसे इसके द्वारा चलाया जाना चाहिए। इसलिए आप स्क्रिप्ट की पहली पंक्ति के रूप में निर्दिष्ट (और कर सकते हैं): #! / पथ / से / अच्छा / शेल जो आपके ओएस को इंगित करता है कि स्क्रिप्ट को वास्तव में / पथ / से / अच्छा / शेल के बजाय लॉन्च किया जाना चाहिए।

निष्पादन:

एक निष्पादन योग्य एक फ़ाइल है जिसमें उपयोगकर्ता (ओं) / समूह (ओं) के लिए "x" बिट सेट है जिसे इसके द्वारा लॉन्च किया जाना चाहिए। यह आमतौर पर एक "बाइनरी", या एक स्क्रिप्ट हो सकता है।

युक्ति: file /some/fileआपको फ़ाइल की सामग्री के बारे में अधिक बता सकता है। कोशिश करें file /usr/bin/bashया file /etc/profileकुछ उदाहरण देखें।


आपके वर्तमान शेल द्वारा चलाई जा रही शेन्गलेस लिपियों के बारे में आपका कथन गलत है। व्यवहार ओएस पर निर्भर है। आमतौर पर, या तो पॉसिक्स शेल या आपके लॉगिन शेल का उपयोग किया जाता है।
jlliagre

इस परिशुद्धता के लिए धन्यवाद। मैं अपनी टिप्पणी जोड़ने के लिए अपना उत्तर संपादित करूँगा।
ओलिवियर दुलैक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.