2012-12-14 12 views
68

बैश स्क्रिप्ट में, पहली पंक्ति में #!/bin/bash क्या है?बैश स्क्रिप्ट: #!/बिन/बैश का क्या अर्थ है?

अद्यतन: #!/bin/bash और #!/bin/sh के बीच कोई अंतर है?

+2

@anishsane आपकी टिप्पणी ने मुझे इस गायब फ़ाइल को लिखने के लिए प्रेरित किया echo -e '#!/Bin/rm \ nGoodbye!' > गायब हो जाएं और chmod 700 गायब हो जाएं && ./vanish && बिल्ली गायब हो –

उत्तर

83

इसे shebang कहा जाता है, यह गोले को बताता है कि किस प्रोग्राम को स्क्रिप्ट को समझने के साथ व्याख्या करने के लिए कहा जाता है।

आपके उदाहरण में, स्क्रिप्ट का अर्थ bash खोल द्वारा व्याख्या और चलाया जाना है।

कुछ अन्य उदाहरण shebangs हैं:

(विकिपीडिया से)

#!/bin/sh — Execute the file using sh, the Bourne shell, or a compatible shell 
#!/bin/csh — Execute the file using csh, the C shell, or a compatible shell 
#!/usr/bin/perl -T — Execute using Perl with the option for taint checks 
#!/usr/bin/php — Execute the file using the PHP command line interpreter 
#!/usr/bin/python -O — Execute using Python with optimizations to code 
#!/usr/bin/ruby — Execute using Ruby 

और इस तरह के रूप में कुछ अतिरिक्त लोगों को मैं अपने सिर के ऊपर से सोच सकते हैं,:

#!/bin/ksh 
#!/bin/awk 
#!/bin/expect 

बैश शेबैंग के साथ एक स्क्रिप्ट में, उदाहरण के लिए, आप बैश सिंटैक्स के साथ अपना कोड लिखेंगे; जबकि शेबांग की उम्मीद के साथ एक स्क्रिप्ट में, आप इसे सिंटैक्स की उम्मीद में कोड करेंगे, और इसी तरह।

अद्यतन हिस्से को उत्तर:

यह क्या /bin/sh वास्तव में आपके सिस्टम पर के लिए अंक पर निर्भर करता है। अक्सर यह /bin/bash पर एक सिम्लिंक है। कभी कभी पोर्टेबल लिपियों #!/bin/sh साथ लिखा जाता है सिर्फ दर्शाता है कि यह एक खोल स्क्रिप्ट है, लेकिन यह का उपयोग करता है, जो भी खोल कि विशेष रूप से सिस्टम पर /bin/sh से जाना जाता है

+0

धन्यवाद! लेकिन क्या '#!/Bin/bash' और' #!/Bin/sh' के बीच कोई अंतर है? – Raptor

+1

@ShivanRaptor '#!/Bin/bash' मतलब इस स्क्रिप्ट को बाश में चलाते हैं। '#!/bin/sh' का मतलब है कि इस स्क्रिप्ट को 'sh' में चलाएं जो डिफ़ॉल्ट यूनिक्स शैल है, जो कि bash या किसी अन्य संस्करण जैसे ksh, dash, zsh, आदि –

+0

हो सकता है जब' bash' 'sh' के रूप में चलाया जाता है , यह 'bash' के रूप में चलाए जाने की तुलना में अलग-अलग (अधिक POSIX- जैसा) व्यवहार करता है। मैनुअल पढ़ें; यह उस विवरण को कवर करता है। –

10

जब में पहली वर्ण (शायद यह /bin/bash, /bin/ksh या /bin/zsh को इंगित करता है) एक स्क्रिप्ट #! है, जिसे shebang कहा जाता है। यदि आपकी फ़ाइल #!/path/to/something के साथ शुरू होती है तो मानक something चलाने के लिए है और बाकी फ़ाइल को उस प्रोग्राम में इनपुट के रूप में पास करना है।

इसी के साथ #!/bin/bash के बीच कहा, अंतर, #!/bin/sh, या यहाँ तक कि क्या #!/bin/zsh बैश, श, या zsh कार्यक्रमों फ़ाइल के बाकी व्याख्या करने के लिए उपयोग किया जाता है। bash और sh परंपरागत रूप से केवल अलग-अलग कार्यक्रम हैं। कुछ लिनक्स सिस्टम पर वे एक ही कार्यक्रम की दो प्रतियां हैं। अन्य लिनक्स सिस्टम पर, shdash का एक लिंक है, और पारंपरिक यूनिक्स सिस्टम (सोलारिस, आईरिक्स, आदि) bash पर आमतौर पर sh से एक पूरी तरह से अलग प्रोग्राम है।

बेशक, शेष रेखा को sh में समाप्त नहीं होना चाहिए। यह #!/usr/bin/python, #!/usr/bin/perl, या यहां तक ​​कि #!/usr/local/bin/my_own_scripting_language भी हो सकता है।

+0

'sh' आमतौर पर एक संगतता मोड चला रहा है', यह सच रहा है क्योंकि बैश अधिकांश लिनक्स डिस्ट्रो के लिए डिफ़ॉल्ट खोल बन गया है, और आईआईआरसी इससे पहले कुछ अच्छे वर्षों के लिए सुरक्षित है, यह कहने के लिए सुरक्षित है कि यह 15 साल हो गया है, संभवतः इससे अधिक 20. – ocodo

+0

मेरे डेबियन और उबंटू सिस्टम पर, '/ bin/sh' डैश है। एंड्रॉइड का कहना है कि यह 'राख' का उपयोग '/ bin/sh' के रूप में करता है। –

+1

@ जोशुआ डीबॉयड अच्छा पकड़, कई (हालांकि शायद सभी नहीं) बीएसडी यूनिक्स एश का उपयोग करते हैं, उनके डिफ़ॉल्ट खोल के रूप में, बैश के विपरीत, और डेबियन/उबंटू डैश का उपयोग करते हैं। इसी तरह बैश के साथ, ऐश और डैश दोनों में 'sh' संगतता मोड हैं। अगर हम सोलारिस, ऐक्स, एचपीयूएक्स, अल्टरिक्स, एससीओ इत्यादि में पहुंचे हैं तो प्रत्येक का अपना डिफ़ॉल्ट खोल होगा, जिसमें 'sh' emulation होगा (POSIX अनुपालन के लिए।) – ocodo

12

बैश स्क्रिप्ट में, पहली पंक्ति में #!/Bin/bash क्या होता है?

लिनक्स सिस्टम में, हमारे पास खोल है जो हमारे यूनिक्स कमांड को समझता है। अब यूनिक्स सिस्टम में कई शेल हैं। उनमें से, बैश नामक एक खोल है जो बहुत ही आम लिनक्स है और इसका लंबा इतिहास है। यह लिनक्स में डिफ़ॉल्ट शेल द्वारा है।

जब आप एक स्क्रिप्ट (यूनिक्स कमांड का संग्रह और इतने पर) लिखते हैं तो आपके पास यह निर्दिष्ट करने का विकल्प होता है कि इसका उपयोग किस शेल का उपयोग किया जा सकता है। आम तौर पर आप निर्दिष्ट कर सकते हैं कि Shebang (हां यही वह नाम है) का उपयोग करके यह कौन सा खोल होगा।

तो यदि आप अपनी स्क्रिप्ट के शीर्ष पर #!/Bin/bash हैं तो आप अपने सिस्टम को डिफ़ॉल्ट खोल के रूप में बैश का उपयोग करने के लिए कह रहे हैं।

अब आपके दूसरे प्रश्न पर आ रहा है: क्या #!/Bin/bash और #!/Bin/sh के बीच कोई अंतर है?

उत्तर हाँ है। जब आप #!/Bin/bash बताते हैं तो आप कमांड दुभाषिया के रूप में बैश का उपयोग करने के लिए अपने पर्यावरण/ओएस को बता रहे हैं। यह कठिन कोडित चीज है।

प्रत्येक सिस्टम का अपना खोल होता है जो सिस्टम अपनी सिस्टम स्क्रिप्ट को निष्पादित करने के लिए उपयोग करेगा। यह सिस्टम खोल ओएस से ओएस में भिन्न हो सकता है (अधिकांश समय यह बाश होगा। उबंटू ने हाल ही में dash का उपयोग डिफ़ॉल्ट सिस्टम खोल के रूप में किया है)। जब आप #!/Bin/sh निर्दिष्ट करते हैं तो सिस्टम आपकी शैल स्क्रिप्ट को समझने के लिए इसके आंतरिक सिस्टम शैल का उपयोग करेगा।

इस जानकारी को समझाया गया है, जहां अधिक जानकारी के लिए इस link पर जाएं।

आशा है कि यह आपके भ्रम को खत्म कर देगा ... शुभकामनाएं।

संबंधित मुद्दे