शेल स्क्रिप्ट अभी भी # के बिना काम कर रही हैं! ((शा-बैंग लाइन)


10

मैं शेल स्क्रिप्ट्स के लिए नया हूं और कई किताबों में लिखा गया है कि इंटरप्रेटर को इनवाइट करने के लिए स्क्रिप्ट की शुरुआत में # ((बैंग बैंग) लाइन का इस्तेमाल करें। और इससे स्क्रिप्ट के लिए एक नया शेल इनवॉइस किया जाएगा और लाइन द्वारा इंटरप्रिटेशन लाइन की जाएगी। लेकिन एक मेरी मूल लिपि अभी भी जादू की रेखा के बिना चल रही है।

इसलिए मेरे प्रश्न हैं:

  • मेरी मूल स्क्रिप्ट को दुभाषिया कहाँ से मिला।
  • स्क्रिप्ट दुभाषिया का पता लगाने के लिए कैसे प्रबंधित करता है।

अब मैं आपको मेरी मूल लिपि के बारे में बताता हूँ जिसमें यह निम्नलिखित पंक्ति है:

गूंज "जादू लाइनों के बिना मूल स्क्रिप्ट"


जवाबों:


3

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


1
yup..may be my current shell is an invoke an default खोल के लिए शेल स्क्रिप्ट है जिसमें मैजिक नंबर नहीं हैं।
user1678213

1
@ user1678213 हाँ, यह आपका शेल (और कर्नेल नहीं है) जो ऐसा कर रहा है।
गिल्स एसओ- बुराई को रोकें '

1
मेरा मानना ​​है कि POSIX अनिवार्य है कि इस मामले में / बिन / श का उपयोग किया जाए।
वॉनब्रांड

2
@vonbrand यह एक सामान्य गलत धारणा है। POSIX, POSIX शेल को अनिवार्य नहीं बनाता है /bin/sh, बस shएक अनुरूपित PATH की खोज करते समय पहला निष्पादन योग्य पाया जाए।
जुलिएग्रे

3
यह गलत है, यह कभी भी "लॉगिन शेल" नहीं है जो इसे निष्पादित करने के लिए उपयोग किया जाता है। हालांकि क्या हो सकता है कि कॉलिंग शेल (यदि स्क्रिप्ट को शेल से कॉल किया जाता है) में स्वयं का बच्चा हो सकता है।
स्टीफन चेज़लस 2

8

जब आप किसी प्रोग्राम को निष्पादित करते हैं, तो कर्नेल यह जांचता है कि क्या यह कुछ मैजिक बाइट अनुक्रम से शुरू होता है । यदि निष्पादन योग्य फ़ाइल के साथ शुरू होता है #!, तो कर्नेल एक दुभाषिया नाम के रूप में शेष रेखा की व्याख्या करता है। यदि निष्पादन योग्य फ़ाइल के साथ शुरू होता है \177ELF(जहां \177बाइट 127 है), यह फ़ाइल को एक एलएलएफ निष्पादन योग्य के रूप में लोड करता है ; आजकल अधिकांश यूनिक्स प्रणालियों पर यह सामान्य प्रकार है।

यदि कर्नेल फ़ाइल प्रारूप को नहीं पहचानता है, तो यह फ़ाइल को निष्पादित करने से इनकार करता है और त्रुटि ENOEXEC (Exec प्रारूप त्रुटि) देता है। जब शेल ने नोटिस किया कि, यह अपने आप को शेल स्क्रिप्ट के रूप में प्रोग्राम को निष्पादित करने के लिए लेता है।

कार्रवाई में इसे देखने के लिए, अपनी स्क्रिप्ट में कुछ कमांड जोड़ें:

ps l $$
ls -l /proc/$$/exe
echo hello

(यह लिनक्स के लिए है, अन्य यूनियनों के लिए समायोजित करें।) फिर विभिन्न गोले से उस स्क्रिप्ट को चलाने का प्रयास करें। आप देखेंगे कि कुछ गोले स्क्रिप्ट (बैश, ksh93) को निष्पादित करने के लिए खुद का एक नया उदाहरण पेश करते हैं, जबकि अन्य स्पॉन /bin/sh(डैश, pdksh, zsh)।


मैं आपकी ls -lआज्ञा से क्या देखता हूँ ? यह: lrwxrwxrwx 1 i 0 Oct 11 05:15 exe -> /bin/bash-? यदि हां, तो यह क्या कहता है? इसके अलावा, देखा मेरे पास है SHELL=/bin/bashपर envहै, लेकिन बदलते यह परिवर्तन व्यवहार करने के लिए नहीं मालूम था। शायद यह असंबंधित है?
इमानुएल बर्ग

ऐसा लगता है कि आप शेल चर "शेल" को बदल रहे हैं।
user1678213

2
@EmanuelBerg हाँ (मुझे लिखा जाना चाहिए था ls -l /proc/$$/exe, वास्तव में)। exeखोल कि अपनी स्क्रिप्ट लागू है करने के लिए लिंक अंक। जब आप अपनी स्क्रिप्ट चलाते हैं, तो आप देखेंगे कि यह स्क्रिप्ट की व्याख्या करने वाला बैश है। यदि आप इसे उदाहरण pdksh से चलाते हैं, तो यह चलता है /bin/sh। मुझे SHELLउस परिस्थिति में पर्यावरण चर या लॉगिन शेल का उपयोग करने वाले किसी भी शेल के बारे में पता नहीं है।
गिल्स एसओ- बुराई को रोकें

2
@ user1678213 /etc/passwdजब आप SSH पर या एक पाठ कंसोल पर लॉग इन करते हैं तो शेल को परिवर्तन में शेल बदल दिया जाता है। यह नहीं बदलता है कि कौन सी स्क्रिप्ट स्क्रिप्ट निष्पादित कर सकती है।
गिल्स एसओ- बुराई को रोकें

2
@ user1678213 मैंने परीक्षण चलाकर यहां जो कुछ भी लिखा था, उसे सत्यापित किया। मैंने जिन गोले का परीक्षण किया /etc/passwd, उनमें से किसी ने भी यह तय करने के लिए नहीं देखा कि किस खोल का उपयोग करना है, उन्होंने या तो खुद का उदाहरण दिया या निष्पादित किया /bin/sh
गाइल्स का SO- दुष्ट होना बंद हो '

-2

यह संभवतः निम्नलिखित 3 संभावनाओं में से एक है:

  1. आप स्क्रिप्ट को सीधे दुभाषिया के साथ बुला रहे हैं, IE: bash script.sh

  2. स्क्रिप्ट फ़ाइल का नाम एक .sh एक्सटेंशन है, जो इस प्रकार की फ़ाइल के लिए डिफ़ॉल्ट प्रोग्राम देखने के लिए सिस्टम प्राप्त करता है

  3. शेल वातावरण जो आप उपयोग कर रहे हैं, वह 'इको' को ही निष्पादित कर रहा है, क्योंकि मैं केवल अनुमान लगा सकता हूं कि स्क्रिप्ट फ़ाइल निष्पादन योग्य है। यदि, उदाहरण के लिए, आप बैश शेल का उपयोग कर रहे होंगे और आपकी फ़ाइल में एक कमांड होगी जो केवल ksh द्वारा उपयोग की जाती है, तो आप देखेंगे कि यह काम नहीं करेगा।

सौभाग्य!


3
न तो मैंने इसे बैश के साथ बुलाया और न ही किसी विस्तार के साथ।
user1678213

1
और शेल पर्यावरण इसे निष्पादित नहीं कर रहा है क्योंकि जब मैं अपनी स्क्रिप्ट को लागू करने के बाद पीएस कमांड को आमंत्रित करता हूं। ps कमांड दो बैश प्रोसेस दिखाता है। इसका मतलब है कि दो बैश चल रहे हैं। एक अपना लॉगिन बैश खोल और दूसरा पार्टी के लिए मेरे basic_script है
user1678213

1
2: कर्नेल ऐसा कुछ नहीं करेगा। Zsh इसे कर सकता है, और इसे करने में बैश को घुमाया जा सकता है। 3: हाँ, लेकिन यह गोले के बीच थोड़ा भिन्न होता है, मेरा उत्तर देखें।
गिल्स एसओ- बुराई को रोकें '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.