#में क्या अंतर है!/ बिन / श और #!/ बिन / बैश?

अगर मैं लिखता हूं,

#!/bin/bashecho "foo"

या

#!/bin/shecho "foo"

दोनों की पैदावार समान है । मैंने कुछ लिपियों को शुरू करते देखा है #!/bin/sh या #!/bin/bash. क्या उनके बीच कोई अंतर है?

bash और sh दो अलग-अलग गोले हैं । मूल रूप से bash है sh, अधिक सुविधाओं और बेहतर सिंटैक्स के साथ । अधिकांश कमांड समान काम करते हैं, लेकिन वे अलग हैं ।

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

अधिक जानकारी के लिए, http://man.cx/sh, http://man.cx/bash.

लिनक्स और अन्य यूनिक्स जैसी प्रणालियों पर आपके पास कई गोले का विकल्प होता है ।

शेल न केवल आपके छोटे संकेत को खींचने के लिए जिम्मेदार है, बल्कि आपके आदेशों की व्याख्या करने के लिए जिम्मेदार है, खासकर यदि आप जटिल तर्क जैसे पाइप, सशर्त और इतने पर डालते हैं ।

बैश लिनक्स सिस्टम के उपयोगकर्ताओं के लिए डिफ़ॉल्ट शेल के रूप में उपयोग किया जाने वाला सबसे आम शेल है । यह यूनिक्स इतिहास में उपयोग किए जाने वाले अन्य गोले का आध्यात्मिक वंशज है । इसका नाम, बैश बॉर्न-अगेन शेल का संक्षिप्त नाम है, बॉर्न शेल के लिए एक श्रद्धांजलि इसे बदलने के लिए डिज़ाइन किया गया था, हालांकि इसमें सी शेल और कॉर्न शेल की विशेषताएं भी शामिल हैं ।

यह चला है, इन दिनों, से /bin/bash - बैश के साथ कोई भी सिस्टम यहां पहुंच योग्य होगा ।

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

समस्या यह है, विभिन्न गोले में उनके बीच छोटी छोटी विसंगतियां होती हैं, और जब स्क्रिप्ट चलाने की बात आती है, तो ये एक वास्तविक समस्या हो सकती है । बैश इसमें बहुत सारी स्क्रिप्टिंग विशेषताएं हैं जो केवल बैश करने के लिए अद्वितीय हैं, न कि अन्य गोले के लिए । यह ठीक है, अगर आप हमेशा उन स्क्रिप्ट को चलाने के लिए बैश का उपयोग करने जा रहे हैं । अन्य गोले या तो बैश का अनुकरण करने की कोशिश कर सकते हैं, या पॉज़िक्स मानक का पालन कर सकते हैं, जो बैश बहुत अच्छी तरह से समर्थन करता है (हालांकि अपने स्वयं के एक्सटेंशन जोड़ता है) ।

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

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

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

भले ही उबंटू सिस्टम शेल डैश की ओर इशारा कर रहा है, आपका लॉगिन शेल एक उपयोगकर्ता के रूप में इस समय बैश होना जारी है । यही है, जब आप लिनक्स में कहीं भी टर्मिनल एमुलेटर में लॉग इन करते हैं, तो आपका लॉगिन शेल बैश होगा । ऑपरेशन की गति इतनी समस्या नहीं है जब शेल का अंतःक्रियात्मक रूप से उपयोग किया जाता है, और उपयोगकर्ता बैश से परिचित होते हैं (और उनके होम डायरेक्टरी में बैश-विशिष्ट अनुकूलन हो सकते हैं) ।

स्क्रिप्ट लिखते समय आपको क्या उपयोग करना चाहिए

यदि आपकी स्क्रिप्ट को केवल बैश द्वारा समर्थित सुविधाओं की आवश्यकता है, तो उपयोग करें #!/bin/bash.

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

पिछले उत्तरों के अलावा, भले ही /bin/sh एक प्रतीकात्मक लिंक है /bin/bash, #!/bin/sh पूरी तरह से बराबर नहीं है #!/bin/bash.

से बैश(1) मैन पेज :

"यदि बैश को एसएच नाम से बुलाया जाता है, तो यह एसएच के ऐतिहासिक संस्करणों के स्टार्टअप व्यवहार की यथासंभव बारीकी से नकल करने की कोशिश करता है, जबकि पॉज़िक्स मानक के अनुरूप भी । "

उदाहरण के लिए बैश विशिष्ट सिंटैक्स :

 exec  > >(tee logfile.txt)

एक शेल में एक त्रुटि देता है जिसके साथ शुरुआत होती है #!/bin/sh>, यहां तक कि श-बैश प्रतीकात्मक लिंक के साथ भी ।

जीएनयू बैश: #!/bin/bash; पॉज़िक्स शेल: #!/bin/sh.