2012-01-23 12 views
346

मैंने Bash स्क्रिप्ट पहले बनाए हैं और वे सभी शुरुआत में इसके बिना ठीक से भाग गए हैं। इसे डालने का क्या मतलब है? क्या चीजें अलग होंगी?आपको स्क्रिप्ट फ़ाइल की शुरुआत में #!/Bin/bash डालने की आवश्यकता क्यों है?

इसके अलावा, आप कैसे # उच्चारण करते हैं? मुझे पता है कि ! को "बैंग" कहा जाता है।

#! कैसे कहा जाता है?

+5

आपको इसकी आवश्यकता नहीं है और आपको तब तक नहीं करना चाहिए जब तक आपके पास कोई विकल्प न हो। जब आप कर सकते हैं और '(POSIX) खोल और बैश के बीच के अंतर के बारे में जानें, तो' #!/Bin/sh 'का उपयोग करें। आपके रेज़्यूमे में बहुत अधिक समय बढ़ने से एक दिन पहले आएगा जब आप खुद को एक अलग शैल वाले सिस्टम पर पाएंगे और आप अभी भी अपनी स्क्रिप्ट को काम करना चाहते हैं। – Jens

+26

इसे "हैश-बैंग" या "शे-बैंग" कहा जाता है। – Beachhouse

+10

मुझे लगता है कि यह ध्यान देने योग्य है कि यह केवल तभी निष्पादित किया जाता है जब आप अपनी स्क्रिप्ट को निष्पादन योग्य के रूप में चलाते हैं। तो यदि आप निष्पादन योग्य ध्वज सेट करते हैं और फिर '।/Yourscript.extension' टाइप करें, उदाहरण के लिए,'।/Helloworld.py' या '।/Helloworld.sh', तो वह उस शीर्ष रेखा पर दुभाषिया की तलाश करेगा, जो होगा '#!/bin/python' या '! #/bin/bash' हो, जबकि' python helloworld.py' जैसी स्क्रिप्ट को निष्पादित करते समय, पहली पंक्ति नहीं देखी जाएगी क्योंकि इसकी टिप्पणी की गई है। तो यह खोल/कर्नेल के लिए एक विशेष अनुक्रम है। – JFA

उत्तर

306

यह एक सम्मेलन है इसलिए * निक्स खोल जानता है कि किस प्रकार का दुभाषिया चलाने के लिए।

उदाहरण के लिए, ATT के पुराने जायके, (बॉर्न शैल) सामान्य रूप से, जबकि बीएसडी के पुराने संस्करणों csh (सी खोल) को चूक।

यहां तक ​​कि आज (जहां अधिकांश सिस्टम बैश चलाने के लिए, "बॉर्न फिर शैल"), लिपियों बैश, अजगर, पर्ल, रूबी, पीएचपी, में किया जा सकता है आदि, आदि उदाहरण के लिए, आप देख सकते हैं #!/bin/perl या #!/bin/perl5

पुनश्च: विस्मयादिबोधक चिह्न (!) प्यार से "बैंग" कहा जाता है। खोल टिप्पणी प्रतीक (#) कभी-कभी "हैश" कहा जाता है।

पी पी एस: याद रखें -, * nix के तहत एक फ़ाइल प्रकार के साथ एक प्रत्यय जोड़ महज एक सम्मेलन, नहीं एक "नियम" है। एक निष्पादन योग्य एक बाइनरी प्रोग्राम हो सकता है, कोई भी लाखों स्क्रिप्ट प्रकारों और अन्य चीजों में से एक भी हो सकता है। इसलिए #!/bin/bash की आवश्यकता है।

+1

मुझे कुछ और उपयोगी, $ # के बारे में पता चला। उसे क्या कहा जाता है? –

+69

शेबांग एक * खोल * सम्मेलन नहीं है, इसे 'execve (2) 'syscall को संभालने पर * कर्नेल * द्वारा व्याख्या किया जाता है; तो शेबांग एक * कर्नेल * सम्मेलन है, एक खोल नहीं है। –

+6

इसके अलावा, यह कुछ संपादकों की मदद करता है जैसे कि विम सिंटैक्स हाइलाइटिंग के लिए भाषा निर्धारित करता है यदि फ़ाइल में एक्सटेंशन नहीं है। शेबांग के बिना, विम एक बैश स्क्रिप्ट को सादा पाठ फ़ाइल के समान प्रदर्शित करेगा। –

13

ऑपरेटिंग सिस्टम आपकी खोल स्क्रिप्ट चलाने के लिए डिफ़ॉल्ट खोल लेता है। इसलिए स्क्रिप्ट की शुरुआत में खोल पथ का उल्लेख करते हुए, आप ओएस से उस विशेष खोल का उपयोग करने के लिए कह रहे हैं। यह portability के लिए भी उपयोगी है।

12

प्रत्येक वितरण में एक डिफ़ॉल्ट खोल है। अधिकांश सिस्टम पर बैश डिफ़ॉल्ट है। यदि आप किसी ऐसे सिस्टम पर काम करना चाहते हैं जिसमें एक अलग डिफ़ॉल्ट शैल है, तो स्क्रिप्ट्स इरादे के रूप में काम नहीं कर सकती हैं अगर वे बैश के लिए विशिष्ट लिखे गए हैं।

बैश ksh और sh से कोड लेने के वर्षों में विकसित हुआ है।

आपकी स्क्रिप्ट की पहली पंक्ति के रूप में #!/bin/bash जोड़ना, ओएस को स्क्रिप्ट में अनुसरण किए गए आदेशों को निष्पादित करने के लिए निर्दिष्ट shell को आमंत्रित करने के लिए कहता है।

#! को अक्सर "हैश-बैंग", "शे-बैंग" या "शा-बैंग" के रूप में जाना जाता है।

40

इसे shebang कहा जाता है। यूनिक्स-स्पीच में, # को तेज (संगीत में) या हैश (ट्विटर पर हैशटैग की तरह) कहा जाता है, और! बैंग कहा जाता है। (आप वास्तव में अपने पिछले शेल कमांड को संदर्भित कर सकते हैं !!, जिसे बैंग-बैंग कहा जाता है)। तो जब एक साथ रखा जाता है, तो आपको हेएसएच-बैंग, या शेबांग मिलता है।

# के बाद का हिस्सा! यूनिक्स बताता है कि इसे चलाने के लिए किस प्रोग्राम का उपयोग करना है। यदि यह निर्दिष्ट नहीं है, तो यह बैश (या sh, या zsh, या जो भी आपका $ SHELL वैरिएबल है) के साथ प्रयास करेगा, लेकिन यदि यह वहां है तो वह उस प्रोग्राम का उपयोग करेगा।इसके अलावा, # अधिकांश भाषाओं में एक टिप्पणी है, इसलिए बाद के निष्पादन में रेखा को अनदेखा कर दिया जाता है।

+1

चलाता है यदि मैं पहले से ही बैश में हूं, तो यह एक और बैश उदाहरण शुरू करता है यदि यह देखता है #!/bin/bash? क्या होगा यदि मैं पहले से ही बैश में हूं और मैं इसे छोड़ देता हूं? क्या कोई अंतर है? –

+2

@javascriptninja किसी भी तरह से यह एक नया बैश खोल शुरू होता है। बैश के मामले में, वास्तव में कोई अंतर नहीं है, जब तक आप पहले से ही बैश का उपयोग कर रहे हैं। शेबैंग केवल वास्तव में मायने रखता है अगर (ए) आपको उस चीज़ में भागने की ज़रूरत है जो सिर्फ एक खोल नहीं है, जैसे कि अजगर या पर्ल, या (बी) आप बैश खोल का उपयोग नहीं करते हैं (यानी आप zsh का उपयोग करते हैं) लेकिन आपको इसकी आवश्यकता है कुछ ऐसा चलाएं जिसे बैश में चलाने की आवश्यकता है। – austin1howard

+0

हालांकि, मेरी राय में शेबांग को शामिल करना अच्छा अभ्यास है, बस कोड पढ़ने वाले किसी को पता है कि क्या हो रहा है। – austin1howard

8

इसे शेबैंग कहा जाता है। इसमें एक संख्या चिह्न और विस्मयादिबोधक बिंदु वर्ण (#!) होता है, इसके बाद दुभाषिया के पूर्ण पथ जैसे/bin/bash। यूनिक्स और लिनक्स के तहत सभी स्क्रिप्ट्स पहली पंक्ति पर निर्दिष्ट दुभाषिया का उपयोग करके निष्पादित करती हैं।

15

shebang#! के बाद निर्दिष्ट प्रोग्राम के उपयोग के लिए लोडर को निर्देश है, जब आप इसे निष्पादित करने का प्रयास करते हैं तो फ़ाइल के लिए दुभाषिया के रूप में। इसलिए, यदि आप foo.sh नामक फ़ाइल चलाने की कोशिश करते हैं जिसमें शीर्ष पर #!/bin/bash है, तो वास्तविक आदेश जो चलता है /bin/bash foo.sh है। यह विभिन्न कार्यक्रमों के लिए विभिन्न दुभाषियों का उपयोग करने का एक लचीला तरीका है। यह सिस्टम स्तर पर लागू कुछ है और उपयोगकर्ता स्तर एपीआई शेबांग सम्मेलन है।

यह जानना भी उचित है कि शेबांग magic number है - एक मानव पठनीय व्यक्ति जो फ़ाइल को दिए गए दुभाषिया के लिए स्क्रिप्ट के रूप में पहचानता है।

शेबैंग के बिना भी "काम" करने के बारे में आपका बिंदु केवल इसलिए है क्योंकि प्रश्न में प्रोग्राम एक शेल स्क्रिप्ट है जिसे आप उपयोग कर रहे हैं उसी शेल के लिए लिखा गया है। उदाहरण के लिए, आप जावास्क्रिप्ट फ़ाइल को बहुत अच्छी तरह से लिख सकते हैं और फिर जावास्क्रिप्ट "शैल स्क्रिप्ट" रखने के लिए #! /usr/bin/js (या कुछ समान) डाल सकते हैं।

106

, अधिक shebang#! सटीक होना जब यह एक निष्पादन (xmode) फ़ाइल के पहले दो बाइट्स की है, execve(2) सिस्टम कॉल (जो कार्यक्रमों पर अमल) द्वारा व्याख्या की है। लेकिन POSIX specification for execve शेबांग का जिक्र नहीं है।

इसके बाद एक दुभाषिया निष्पादन योग्य फ़ाइल फ़ाइल का अनुसरण किया जाना चाहिए (जिसे बीटीडब्लू भी रिश्तेदार हो सकता है, लेकिन अक्सर पूर्ण होता है)।

एक अच्छा चाल (या शायद not so nice एक) उपयोगकर्ता के $PATH में एक दुभाषिया (जैसे python) को खोजने के लिए env कार्यक्रम (हमेशा सभी लिनक्स पर /usr/bin/env पर) जैसे जैसे उपयोग करने के लिए है

#!/usr/bin/env python 

कोई भी ईएलएफ निष्पादन योग्य एक दुभाषिया हो सकता है। यदि आप चाहें तो #!/bin/cat या #!/bin/true का भी उपयोग कर सकते हैं! (लेकिन यह अक्सर बेकार होगा)

+8

'#!/Usr/bin/env' हैक की चर्चा के लिए [यह प्रश्न] देखें (http://unix.stackexchange.com/q/29608/10454)। –

+0

अगर मैं पायथन के लिए एक तर्क पारित करना चाहता हूं तो मैं वास्तव में कैसे करूँगा, मैं वास्तव में '#!/Usr/bin/env bash -x' निष्पादित करना चाहता हूं। मैं उसको कैसे करू ? – nepsdotin

+0

इसके सरल मैंने स्वयं इसे पाया, बस उस ##!/Usr/bin/env bash -x' – nepsdotin

0

यह किसी ऐसे व्यक्ति के लिए उपयोगी हो सकता है जो उस पुस्तकालय को आसानी से उपलब्ध न हो। यदि यह घोषित नहीं किया गया है और आपके पास उस स्क्रिप्ट में कुछ फ़ंक्शन हैं जो उस सिस्टम द्वारा समर्थित नहीं हैं, तो आपको #/bin/bash घोषित करना चाहिए। मैं काम से पहले इस समस्या में भाग गया हूं और अब मैं इसे एक अभ्यास के रूप में शामिल करता हूं।

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