आपको स्क्रिप्ट फ़ाइल की शुरुआत में #! / Bin / bash डालने की आवश्यकता क्यों है?


484

मैंने पहले बैश स्क्रिप्ट बनाई है और वे सभी #!/bin/bashशुरुआत में बिना ठीक चले ।

इसमें डालने की क्या बात है? क्या चीजें अलग होंगी?

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

कैसे #!उच्चारण किया जाता है?


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

50
इसका उच्चारण "हैश-बैंग" या "शी-बैंग" है।
समुद्र तट

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

@ जेएफए, बैश और अजगर के बीच अनुक्रम में एक बदलाव है, जब उपयोग! # अजगर और # के लिए! बैश के लिए?
AAI

1
@AjeyaAnand नहीं, यह गलत था, अच्छा पकड़
JFA

जवाबों:


425

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

उदाहरण के लिए, एटीटी के पुराने स्वादों को शॉ (बॉर्न शेल) में डिफॉल्ट किया गया, जबकि बीएसडी के पुराने संस्करणों को सीएचएस (सी शेल) के लिए डिफॉल्ट किया गया ।

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

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

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


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

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

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

1
यह मुझे आश्चर्य है कि क्या आप जोड़ने की जरूरत है बनाता है #!/bin/shजैसी चीजों के लिए .profileहै कि रन और सामान ऑनलोड
Kolob घाटी

5
तो ... हैश-बैंग-स्लैश-बिन-स्लेश-बैश ?
बर्नट

134

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

यह एक दुभाषिया निष्पादन योग्य की फ़ाइल पथ द्वारा अनुसरण किया जाना चाहिए (जो कि BTW भी ​​सापेक्ष हो सकता है, लेकिन सबसे अधिक बार निरपेक्ष है)।

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

 #!/usr/bin/env python

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


8
हैक की चर्चा के लिए यह प्रश्न देखें #!/usr/bin/env
कीथ थॉम्पसन

अगर मैं अजगर के लिए एक तर्क पारित करना चाहता हूं तो मैं कैसे करता हूं कि वास्तव में मैं निष्पादित करना चाहता हूं #!/usr/bin/env bash -x। मैं उसको कैसे करू ?
भारतीय कबड्डी

इसका सरल मैं खुद यह पाया, बस उसके बाद परम जोड़ें#!/usr/bin/env bash -x
indianwebdevil

bashयह लगभग हमेशा होता है, /bin/bashइसलिए आपका #!/bin/bash -x
शेबंग

49

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

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


2
यदि मैं पहले से ही बैश में हूं, तो क्या यह #? / बिन / बैश देखता है तो दूसरा बैश इंस्टेंस शुरू करता है? क्या होगा अगर मैं पहले से ही बैश हूं और मैं इसे छोड़ दूं? क्या कोई अंतर है?
नोड निंजा

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

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

2
गलत: execve(2)syscall $SHELLवैरिएबल का उपयोग नहीं करता है। यह कर्नेल है जो शेबंग की व्याख्या कर रहा है।
बेसिल स्टायरनेविच

1
@BasileStarynkevitch जो सही है, कर्नेल में योगिनी लोडर शेबंग की व्याख्या करता है। मैं यह कह रहा था कि यदि शेलबंग प्रदान नहीं किया गया तो $ SHELL का उपयोग किया जाएगा।
austin1howard

19

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

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

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


18

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


15

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

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

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

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


9

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



0

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.