"#" के साथ "शी-बैंग" क्यों शुरू होता है?


10

"शी-बैंग" एक के साथ क्यों शुरू होता है #!, जैसे #!/bin/bash? मैंने हमेशा स्वीकार किया है कि यह कैसे किया जाता है, लेकिन क्या इसके पीछे कोई कारण है?

क्यों से शुरू करें #; यह आमतौर पर एक टिप्पणी नहीं है? या यह मुद्दा है कि यह टिप्पणी की जानी चाहिए?


4
विकिपीडिया का एक विस्तृत इतिहास है #!(जितना dmr याद है ...), क्यों #(हाँ, लाइन को मौजूदा गोले द्वारा अनदेखा किया जाना था ) के स्पष्टीकरण सहित ।
गिल्स एसओ- बुराई को रोकना '

विकिपीडिया की जाँच करना याद किया :)
जोहान

1
मैं चाहता हूं कि गोले एक बाहरी सीआर / एलएफ को छीनने के लिए पर्याप्त स्मार्ट थे यदि यह वहां है ...?)
हारून डी। मैरास्को

जवाबों:


16

आमतौर पर शेबंग का तात्पर्य सिर्फ #!( !"आम तौर पर" धमाकेदार "कहा जाता है, और ऐसा लगता है कि" वह "या तो" SHArp "या" हश "के लिए एक भ्रष्टाचार है #) - पूरी रेखा को एक शबंग रेखा कहा जाता है

यह जानबूझकर उन चीजों के साथ पीछे-संगतता के लिए एक टिप्पणी चरित्र के साथ शुरू होता है जो इसे संभालना नहीं जानते हैं; !सिर्फ फ़ाइल शुरू करने के लिए एक यादृच्छिक टिप्पणी से अलग करने, इसलिए किसी फ़ाइल के साथ शुरू होता शायद है # this is my script!चलाने का प्रयास नहीं करता है this is my script!दुभाषिया


2
बैंग !को अक्सर अन्य संदर्भों में प्रयोग किया जाता है ताकि कमांड को निष्पादित किया जा सके। उदाहरण के लिए vimया अपनी स्वयं की कमांड लाइनों के साथ अन्य कार्यक्रमों में, धमाका अक्सर बच चरित्र होता है जो उन्हें अपने आंतरिक इंटरफ़ेस के बजाय सिस्टम शेल में कमांड चलाने देता है।
कालेब

4

इसे समझने के लिए आपको महसूस करना चाहिए कि स्क्रिप्ट की पहली पंक्ति वास्तव में दो बार , 2 अलग-अलग कार्यक्रमों द्वारा पढ़ी जाती है। पहली बार, कर्नेल फ़ाइल खोलता है और #!पहली पंक्ति पर उस वर्ण अनुक्रम ( ) की तलाश करता है। यदि यह पता चलता है, तो यह शेल प्रोग्राम को चलाता है जो वहां इंगित किया गया है, फ़ाइल नाम को एक पैरामीटर के रूप में पास करना। (जैसे यदि फ़ाइल के /home/me/fooसाथ शुरू होता है #!/bin/sh, तो कर्नेल चलेगा /bin/sh /home/me/foo)।

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


क्या यह वास्तव में कर्नेल है जो ऐसा करता है, ऐसा लगता है कि यह आपके द्वारा काम किया जाने वाला वर्तमान शेल है जो शेल्बर को पार्स करेगा और फिर स्क्रिप्ट को आगे बढ़ाएगा
जोहान

नहीं ... यह कर्नेल ही है, जीवित और व्यक्ति में। यहां तक ​​कि अगर आप स्क्रिप्ट को निष्पादित करने के लिए शेल का उपयोग नहीं कर रहे हैं तो भी यह काम करेगा ... शेल के अलावा किसी फ़ाइल को निष्पादित करने के अन्य तरीके भी हैं ... उदाहरण के लिए, सी प्रोग्राम से, "निष्पादित" सिस्टम कॉल का उपयोग करके
जोएलफैन

en.wikipedia.org/wiki/Shebang_(Unix)#Magic_number "#!" ascii में बाइट्स 0x23 0x21 है - जब निष्पादन () इन बाइट्स को देखता है तो व्यवहार को बाकी रेखा को एक दुभाषिया के लिए एक पथ के रूप में व्यवहार करना है।
एरोन मैकमिलिन

1

यह एक टिप्पणी करने की आवश्यकता है क्योंकि केवल इस तरह से यह "इंटरप्रेट्रोनम स्क्रिप्टनाम" जैसी स्क्रिप्ट को चलाने के लिए भी काम करेगा। मुझे "!" की उत्पत्ति के बारे में नहीं पता है।


1
यहां तक ​​कि अगर आप बस चलाते हैं ।/scriptname, दुभाषिया अभी भी शाइन-बैंग लाइन को देखता है, इसलिए इसे अभी भी टिप्पणी करने की आवश्यकता है।
Psusi

1
या अधिक विस्तृत होने के लिए: शेबंग: '#!' को दुभाषिया द्वारा नहीं देखा जाना चाहिए - इस प्रकार यह टिप्पणी चार '#' से शुरू होनी चाहिए। इसके बजाय, यह कर्नेल के 'एक्वीज़ [lv] *' सिस्टम कॉल के 'देखा' (और व्याख्या) है।
arielf
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.