UNIX शेल स्क्रिप्ट में "#! / Bin / sh" लाइन का क्या अर्थ है?


142

मैं कुछ शेल स्क्रिप्ट ट्यूटोरियल से गुजर रहा था और निम्नलिखित नमूना कार्यक्रम पाया:

#!/bin/sh
clear
echo "HELLO WORLD"

क्या कोई मुझे बता सकता है #!/bin/shकि शुरुआत में टिप्पणी का क्या महत्व है?





जवाबों:


143

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

जैसे

#!/usr/bin/perl   <--perl script'
#!/usr/bin/php <-- php script
#!/bin/false <--- do-nothing script, because false returns immediately anyways.

यह एक टिप्पणी के रूप में लागू किया जाता है ताकि उस पंक्ति में आने वाली कोई भी चीज निर्दिष्ट किए गए दुभाषिया के लिए "प्रासंगिक" न हो। उदाहरण के लिए, सभी स्क्रिप्टिंग भाषाएं यह समझती हैं कि एक रेखा के साथ शुरू होने वाली #एक टिप्पणी है, और उस !/usr/bin/whateverहिस्से को अनदेखा कर देगी , जो अन्यथा उस विशेष भाषा में एक वाक्यविन्यास त्रुटि हो सकती है।


6
यह आमतौर पर कर्नेल है, शेल नहीं, जो इसे प्रोसेस करता है। शेल केवल exec()फ़ाइल पर सिस्टम कॉल को कॉल करता है।
ट्रिपलए

47

जब आप यूनिक्स (निष्पादन योग्य बिट सेट के साथ एक) में एक कार्यक्रम को निष्पादित करने का प्रयास करते हैं, तो ऑपरेटिंग सिस्टम फ़ाइल के पहले कुछ बाइट्स को देखेगा। ये तथाकथित "मैजिक नंबर" बनाते हैं, जिसका उपयोग कार्यक्रम के प्रारूप और इसे निष्पादित करने के तरीके को तय करने के लिए किया जा सकता है।

#!जादू नंबर 0x2321 से मेल खाती है (इसे अस्सी टेबल पर देखें)। जब सिस्टम देखता है कि जादू की संख्या, यह जानता है कि यह एक टेक्स्ट स्क्रिप्ट के साथ काम कर रहा है और अगले तक पढ़ता है \n(एक सीमा है, लेकिन यह मुझे एटीएम से बच जाता है)। दुभाषिया (शेबंग के बाद पहला तर्क) की पहचान करने के बाद वह दुभाषिया को बुलाएगा।

अन्य फाइलों में भी मैजिक नंबर होते हैं। बिटमैप (.BMP) फ़ाइल के माध्यम lessसे देखने का प्रयास करें और आप देखेंगे कि पहले दो अक्षर हैं BM। यह मैजिक नंबर बताता है कि फाइल वास्तव में बिटमैप है।


10

यदि यह स्क्रिप्ट जिस फ़ाइल में रहती है, निष्पादन योग्य है, हैश-बैंग #!ऑपरेटिंग सिस्टम को बताता है कि स्क्रिप्ट को चलाने के लिए कौन से दुभाषिया का उपयोग करना है। इस मामले में यह /bin/shउदाहरण के लिए है।

अधिक जानकारी के लिए इसके बारे में एक विकिपीडिया लेख है


5

पहली पंक्ति शेल को बताती है कि यदि आप स्क्रिप्ट को सीधे निष्पादित करते हैं (.run.sh; जैसा कि / bin / sh run.sh के विपरीत), तो उसे व्याख्या करने के लिए उस प्रोग्राम (/ bin / sh) का उपयोग करना चाहिए।

आप इसका इस्तेमाल आम तौर पर तर्क-वितर्क (त्रुटि पर बाहर निकलने), या अन्य कार्यक्रमों (/ बिन / जाग, / usr / बिन / पर्ल, आदि) का उपयोग करने के लिए भी कर सकते हैं।


-4

#!/bin/shया #!/bin/bashस्क्रिप्ट की पहली पंक्ति होनी चाहिए क्योंकि यदि आप इसे पहली पंक्ति पर उपयोग नहीं करते हैं, तो सिस्टम उस स्क्रिप्ट के सभी कमांड को अलग-अलग कमांड के साथ व्यवहार करेगा। यदि पहली पंक्ति है #!/bin/shतो यह सभी कमांड्स को एक स्क्रिप्ट के रूप में मानेगा और यह दिखाएगा कि यह फाइल psकमांड में चल रही है न कि फाइल के अंदर कमांड्स।

./echo.sh

ps -ef |grep echo
trainee   3036  2717  0 16:24 pts/0    00:00:00 /bin/sh ./echo.sh
root      3042  2912  0 16:24 pts/1    00:00:00 grep --color=auto echo

1
स्टैक ओवरफ्लो ट्विटर नहीं है। कृपया समय निकाल कर "u" और "1st" जैसे शब्दों का उच्चारण करें। आप एक संदर्भ पुस्तक लिखने में मदद कर रहे हैं, इसलिए उचित व्याकरण और वर्तनी महत्वपूर्ण है। इसके अलावा, उचित स्वरूपण पर ध्यान दें। कमांड-लाइन, जैसे ps, और कोड अंश से जारी किए जाने वाले कमांड #!/bin/shको स्वरूपित किया जाना चाहिए।
टिन मैन

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