#? / Bin / sh और #? / Bin / bash में क्या अंतर है?


280

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

#!/bin/bash
echo "foo"

या

#!/bin/sh
echo "foo"

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

जवाबों:


242

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

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

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


24
आपका पहला पैराग्राफ काफी भ्रामक है। "श" बिल्कुल भी एक शेल नहीं है, लेकिन वर्तमान में कॉन्फ़िगर किए गए सिस्टम शेल के लिए एक सिमलिंक है , जो कि लिनक्स सिस्टम पर आमतौर पर बैश या डैश होता है (उत्तरार्द्ध का उपयोग करके उबंटू के हाल के संस्करण)।
थोमसट्रेटर

18
/bin/sh1977 में बोर्न शेल नामक एक शेल हुआ करता था। बैश एक / बिन / श संगत शेल है जिसे बोर्न शेल प्रतिस्थापन के रूप में इस्तेमाल किया जा सकता है जो कि पॉज़िक्स अनुरूप है। en.wikipedia.org/wiki/Bourne_shell
एलेक्स

5
बैश एक वास्तविक मानक है (बहुत व्यापक रूप से उपयोग किया जाता है) लेकिन यह "मानक" नहीं है; शब पर उबंटू डैश का उपयोग करता है , जो कि एक पॉज़िक्स-अनुरूप शेल है, इसलिए यह वास्तव में मानक है। मेरी सलाह है कि स्क्रिप्टिंग के लिए डैश का उपयोग जितनी बार संभव हो, खासकर सर्वर-साइड स्क्रिप्ट के लिए करें। हालांकि बैश अधिक अभिव्यंजक है, डैश बहुत तेज़ चलता है और अधिक सुरक्षित है।
रिक -777

@ रिक -777 तो क्या मुझे अपनी स्क्रिप्ट के शीर्ष पर स्पष्ट रूप से #? / बिन / डैश रखना चाहिए? मैंने ऐसी स्क्रिप्ट भी लिखी हैं, जहाँ मैं केवल कमांड लिखता / निष्पादित करता हूँ ।/criptName और यह ठीक काम करता है। क्या #? / Bin / yourShellHere आवश्यक है?
user137717

@ रिक -777 उन मामलों में जहां मैंने किसी # को बाहर कर दिया है! / बिन / शेलनाम, मैंने फाइलों का नाम रखा है name.sh। क्या # #? / Bin / sh घोषित किए बिना पसंदीदा सिस्टम शेल से लिंक किया जाएगा?
user137717

82

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

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

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

यह चलाया जाता है, इन दिनों, से /bin/bash- किसी भी प्रणाली के साथ बैश यह यहाँ सुलभ होगा।

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

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

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

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

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

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

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

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

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


18

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

से बैश (1) आदमी पेज :

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

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

 exec  > >(tee logfile.txt)

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


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