अगर मैं लिखता हूँ,
#!/bin/bash
echo "foo"
या
#!/bin/sh
echo "foo"
दोनों ही पैदावार। मैंने कुछ स्क्रिप्ट्स को शुरू करते हुए #!/bin/sh
या के साथ देखा है #!/bin/bash
। क्या उनके बीच कोई अंतर है?
अगर मैं लिखता हूँ,
#!/bin/bash
echo "foo"
या
#!/bin/sh
echo "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/sh
1977 में बोर्न शेल नामक एक शेल हुआ करता था। बैश एक / बिन / श संगत शेल है जिसे बोर्न शेल प्रतिस्थापन के रूप में इस्तेमाल किया जा सकता है जो कि पॉज़िक्स अनुरूप है। en.wikipedia.org/wiki/Bourne_shell
लिनक्स और अन्य यूनिक्स जैसी प्रणालियों पर आपके पास कई गोले का विकल्प होता है।
शेल न केवल आपके छोटे प्रॉम्प्ट को आरेखित करने के लिए जिम्मेदार है, बल्कि आपकी आज्ञाओं की व्याख्या भी करता है, खासकर अगर आप पाइप, कंडिशन जैसे जटिल लॉजिक में डालते हैं।
लिनक्स सिस्टम के उपयोगकर्ताओं के लिए डिफ़ॉल्ट शेल के रूप में उपयोग किया जाने वाला बैश सबसे आम शेल है। यह यूनिक्स इतिहास भर में इस्तेमाल किए जाने वाले अन्य गोले का आध्यात्मिक वंश है। इसका नाम, बैश बॉर्न-अगेन शेल का संक्षिप्त नाम है, बॉर्न शेल के लिए एक श्रद्धांजलि जिसे इसे बदलने के लिए डिज़ाइन किया गया था, हालांकि इसमें सी शेल और कॉर्न शेल की विशेषताएं भी शामिल हैं।
यह चलाया जाता है, इन दिनों, से /bin/bash
- किसी भी प्रणाली के साथ बैश यह यहाँ सुलभ होगा।
यह केवल ऐसे उपयोगकर्ता नहीं हैं जो गोले का उपयोग करते हैं, हालांकि। लिपियों ( खोल लिपियों ) को उनकी व्याख्या करने के लिए गोले की आवश्यकता होती है। जब आप एक शेल स्क्रिप्ट चलाते हैं, तो आपके सिस्टम को आपकी स्क्रिप्ट निष्पादित करने के लिए एक शेल प्रक्रिया शुरू करनी होगी।
समस्या यह है कि अलग-अलग गोले उनके बीच छोटी-छोटी विसंगतियाँ हैं, और जब यह स्क्रिप्ट चलाने की बात आती है, तो ये एक वास्तविक समस्या हो सकती है। बैश में काफी स्क्रिप्टिंग विशेषताएं हैं जो केवल बैश करने के लिए अद्वितीय हैं, और अन्य गोले के लिए नहीं। यह ठीक है, यदि आप हमेशा उन स्क्रिप्ट को चलाने के लिए बैश का उपयोग करने जा रहे हैं। अन्य गोले या तो बैश का अनुकरण करने की कोशिश कर सकते हैं, या पोसिक्स मानक का पालन कर सकते हैं, जो बैश बहुत अच्छी तरह से समर्थन करता है (हालांकि अपने स्वयं के एक्सटेंशन को जोड़ता है)।
शेल स्क्रिप्ट के शीर्ष पर यह निर्दिष्ट करना संभव है कि किस शेल को शेलबैंग का उपयोग करके चलाया जाना चाहिए। एक स्क्रिप्ट #!/bin/bash
पहली पंक्ति पर निर्दिष्ट हो सकती है , जिसका अर्थ है कि स्क्रिप्ट को हमेशा किसी अन्य शेल के बजाय बैश के साथ चलाया जाना चाहिए।
/ बिन / श एक निष्पादन योग्य है जो सिस्टम शेल का प्रतिनिधित्व करता है । वास्तव में, यह आमतौर पर एक प्रतीकात्मक लिंक के रूप में कार्यान्वित किया जाता है जो कि शेल के लिए निष्पादन योग्य को इंगित करता है जो सिस्टम शेल है। सिस्टम शेल एक डिफ़ॉल्ट शेल है जो सिस्टम स्क्रिप्ट का उपयोग करना चाहिए। लिनक्स वितरण में, लंबे समय तक यह आमतौर पर बैश करने के लिए एक प्रतीकात्मक लिंक था , इतना अधिक है कि यह हमेशा से लिंक / बिन / श को बैश या बैश-संगत शेल से लिंक करने के लिए कुछ हद तक बन गया है। हालांकि, पिछले कुछ वर्षों में डेबियन (और उबंटू) ने बैश से डैश तक सिस्टम शेल को स्विच करने का फैसला किया- एक समान शेल - लिनक्स में एक लंबी परंपरा (अच्छी तरह से, GNU) के साथ / बिन / श के लिए बैश का उपयोग करके तोड़ना। डैश को लाइटर के रूप में देखा जाता है, और बहुत तेज़ी से, शेल जो बूट गति के लिए फायदेमंद हो सकता है (और अन्य चीजें जिन्हें शेल स्क्रिप्ट की बहुत आवश्यकता होती है, जैसे पैकेज इंस्टॉलेशन स्क्रिप्ट)।
डैश बैश के साथ काफी अच्छी तरह से संगत है, एक ही POSIX मानक पर आधारित है। हालाँकि, यह बैश-विशिष्ट एक्सटेंशन को लागू नहीं करता है। अस्तित्व में ऐसी लिपियाँ #!/bin/sh
होती हैं जो उनके शेबंग के रूप में (सिस्टम शेल) का उपयोग करती हैं , लेकिन जिन्हें बैश-विशिष्ट एक्सटेंशन की आवश्यकता होती है। यह वर्तमान में एक बग माना जाता है जिसे डेबियन और उबंटू द्वारा तय किया जाना चाहिए , जिन्हें डैश करने के लिए काम करने में सक्षम होने के लिए / बिन / श की आवश्यकता होती है।
भले ही उबंटू का सिस्टम शेल डैश होने की ओर इशारा कर रहा हो, लेकिन इस समय एक उपयोगकर्ता के रूप में आपका लॉगिन शेल जारी रहेगा। यही है, जब आप लिनक्स में कहीं भी टर्मिनल एमुलेटर पर लॉग इन करते हैं, तो आपका लॉगिन शेल बैश होगा। ऑपरेशन की गति इतनी अधिक नहीं है जब शेल का उपयोग अंतःक्रियात्मक रूप से किया जाता है, और उपयोगकर्ता बैश से परिचित होते हैं (और उनके होम डायरेक्टरी में बैश-विशिष्ट कस्टमाइज़ेशन हो सकते हैं)।
स्क्रिप्ट लिखते समय आपको क्या उपयोग करना चाहिए
यदि आपकी स्क्रिप्ट को केवल बैश द्वारा समर्थित सुविधाओं की आवश्यकता है, तो उपयोग करें #!/bin/bash
।
लेकिन यदि संभव हो तो, यह सुनिश्चित करना अच्छा होगा कि आपकी स्क्रिप्ट POSIX- संगत है, और उपयोग करें #!/bin/sh
, जो हमेशा, काफी मज़बूती से, किसी भी स्थापना में पसंदीदा POSIX- संगत सिस्टम शेल को इंगित करना चाहिए।
पिछले उत्तरों के अलावा, भले ही /bin/sh
एक प्रतीकात्मक लिंक हो /bin/bash
, #!/bin/sh
पूरी तरह से बराबर नहीं है #!/bin/bash
।
से बैश (1) आदमी पेज :
"यदि बैश को नाम श के साथ लगाया जाता है, तो यह पोस मानक के अनुरूप होने के साथ-साथ यथासंभव समीप के ऐतिहासिक संस्करणों के स्टार्टअप व्यवहार की नकल करने की कोशिश करता है।"
उदाहरण के लिए बैश विशिष्ट सिंटैक्स:
exec > >(tee logfile.txt)
एक शेल में त्रुटि देता है #!/bin/sh
, यहां तक कि sh-> बैश प्रतीकात्मक लिंक के साथ जगह में भी।