2011-09-09 11 views
109

मैं कुछ खोल स्क्रिप्ट ट्यूटोरियल के माध्यम से जा रहा है और निम्न नमूना कार्यक्रम मिला था:यूनिक्स शैल स्क्रिप्ट में "#!/Bin/sh" पंक्ति का अर्थ क्या है?

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

किसी को भी कृपया बता सकते हैं टिप्पणी में '!/bin/sh' का उल्लेख का महत्व क्या है?

+1

[मामला] (http://en.wikipedia.org/wiki/Shebang_%28Unix%29) – drootang

+1

askubuntu पर अच्छा स्पष्टीकरण: http://askubuntu.com/questions/141928/what-is- अंतर-बीच-बिन-श-एंड-बिन-बश –

+1

संभावित डुप्लिकेट [आपको स्क्रिप्ट फ़ाइल की शुरुआत में #!/bin/bash क्यों डालना होगा?] (http://stackoverflow.com/questions/8967902/why-do-you-need-to-put-bin-bash-at-the-beginning-of-a-script-file) –

उत्तर

110

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

उदा।

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

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

+3

यह आमतौर पर कर्नेल है, शेल नहीं, जो इसे संसाधित करता है। खोल फ़ाइल पर 'exec()' सिस्टम कॉल को बस कॉल करता है। – tripleee

7

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

अधिक जानकारी के लिए इसके बारे में Wikipedia article है।

5

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

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

41

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

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

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

-3

#!/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

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

+0

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