लघु कहानी: कुटिया (#!
) लाइन
से खोल पढ़ा जाता है (उदाहरण के लिए
sh
,
bash
, आदि)
ऑपरेटिंग सिस्टम के कार्यक्रम लोडर। हालांकि यह औपचारिक रूप से एक टिप्पणी की तरह दिखता है, तथ्य यह है कि फ़ाइल के पहले दो बाइट्स पूरी फ़ाइल को टेक्स्ट फ़ाइल के रूप में और एक स्क्रिप्ट के रूप में चिह्नित करते हैं। शेबैंग के बाद पहली पंक्ति पर वर्णित निष्पादन योग्य को लिपि पारित की जाएगी। देखा!
थोड़ा लंबा कहानी: कल्पना कीजिए कि आप निष्पादन योग्य बिट (x
) सेट के साथ, अपनी स्क्रिप्ट, foo.sh
है। इस फ़ाइल में उदा। निम्नलिखित:
#!/bin/sh
# some script commands follow...:
# *snip*
अब, अपने खोल पर, आप टाइप करें:
> ./foo.sh
संपादित करें: कृपया यह भी टिप्पणी नीचे के बाद या आप निम्नलिखित पढ़ा से पहले पढ़ें! जैसा कि यह पता चला, मैं गलत था। यह स्पष्ट रूप से वह शेल नहीं है जो स्क्रिप्ट को लक्षित दुभाषिया को पास करता है, लेकिन ऑपरेटिंग सिस्टम (कर्नेल) स्वयं ही।
याद रखें कि आप खोल प्रक्रिया के अंदर इस टाइप कि (मान लेते हैं इस कार्यक्रम /bin/sh
है भी नहीं)। इसलिए, उस इनपुट द्वारा उस इनपुट को संसाधित करना होगा। यह इस पंक्ति को कमांड के रूप में व्याख्या करता है, क्योंकि यह पता चलता है कि लाइन पर दर्ज की गई पहली चीज़ एक फ़ाइल का नाम है जो वास्तव में मौजूद है और जिसमें निष्पादन योग्य बिट सेट है।
/bin/sh
फिर फ़ाइल की सामग्री को पढ़ना शुरू कर देता है और फ़ाइल की शुरुआत में शेबैंग (#!
) को ठीक से खोजता है। खोल के लिए, यह एक टोकन ("जादू संख्या") है जिसके द्वारा यह जानता है कि फ़ाइल में एक स्क्रिप्ट है।
अब, यह कैसे पता चलता है कि स्क्रिप्ट को कौन सी प्रोग्रामिंग भाषा लिखा है? आखिरकार, आप बैश स्क्रिप्ट्स, पर्ल स्क्रिप्ट्स, पायथन स्क्रिप्ट्स को निष्पादित कर सकते हैं ... सभी खोल अब तक जानते हैं कि यह एक स्क्रिप्ट फ़ाइल को देख रहा है (जो एक बाइनरी फ़ाइल नहीं है, लेकिन एक टेक्स्ट फ़ाइल है)। इस प्रकार यह पहली पंक्ति ब्रेक तक अगला इनपुट पढ़ता है (जिसके परिणामस्वरूप /bin/sh
होगा, उपर्युक्त के साथ तुलना करें)। यह दुभाषिया है जिसके लिए स्क्रिप्ट निष्पादन के लिए पारित किया जाएगा। (इस विशेष मामले में, लक्ष्य दुभाषिया स्वयं खोल है, इसलिए इसे स्क्रिप्ट के लिए एक नया खोल नहीं डालना पड़ता है; यह बस बाकी स्क्रिप्ट फ़ाइल को संसाधित करता है।)
यदि स्क्रिप्ट नियत थी उदाहरण के लिए/bin/perl
, पर्ल दुभाषिया (वैकल्पिक रूप से) को यह करना है कि यह देखने के लिए कि शेबांग लाइन वास्तव में पर्ल दुभाषिया का उल्लेख करती है या नहीं। यदि नहीं, तो पर्ल दुभाषिया को पता चलेगा कि यह इस स्क्रिप्ट को निष्पादित नहीं कर सकता है। यदि वास्तव में शेबांग लाइन में पर्ल दुभाषिया का उल्लेख किया गया है, तो यह बाकी स्क्रिप्ट फ़ाइल को पढ़ता है और इसे निष्पादित करता है।
मैं comp.lang.shell सूत्र में इस विषय [निष्पादन उपसंहार कार्यक्रमों] (http://groups.google पर एक अच्छी स्कूली शिक्षा मिल गया। कॉम/समूह/comp.unix.shell/ब्राउज_थ्रेड/थ्रेड/ई 7 ए 3306342 सी 01847/ec5741ed3278408a? q = निष्पादन योग्य + पोस्टस्क्रिप्ट + प्रोग्राम # ec5741ed3278408a) कमांड लाइन में हेरफेर करने के लिए एक सरल सी प्रोग्राम लिखकर, मैं निष्पादन योग्य स्क्रिप्ट बनाने में सक्षम था भाषा जो आम तौर पर ऐसा नहीं करती है। –