सवाल #! / Bin / sh और #! / Bin / bash के बीच क्या अंतर है?


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

#!/bin/bash
echo "foo"

या

#!/bin/sh
echo "foo"

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


211
2018-05-25 03:59


मूल




जवाब:


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

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

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


178
2018-05-25 04:08



आपका पहला अनुच्छेद काफी भ्रामक है। "sh" बिल्कुल एक शेल नहीं है, लेकिन वर्तमान में कॉन्फ़िगर करने के लिए एक सिम्लिंक है सिस्टम खोल, जो कि लिनक्स सिस्टम पर आमतौर पर या तो बैश या डैश होता है (बाद में उबंटू के हाल के संस्करण)। - thomasrutter
/bin/sh एक खोल कहा जाता था बोर्न खोल 1 9 77 में वापस। बैश एक / बिन / sh संगत खोल है कि कर सकते हैं पॉर्निक्स अनुरूपता वाले बोर्न शेल प्रतिस्थापन के रूप में उपयोग किया जाना चाहिए। en.wikipedia.org/wiki/Bourne_shell - Alex
दे घुमा के एक वास्तविक तथ्य है (बहुत व्यापक रूप से उपयोग किया जाता है) लेकिन यह "मानक" नहीं है; श उबंटू पर उपयोग करता है पानी का छींटा, जो एक पॉक्सिक्स-अनुरूप शेल है, इसलिए यह वास्तव में मानक है। मेरी सलाह का उपयोग करना है पानी का छींटा स्क्रिप्टिंग के लिए जितनी बार संभव हो, विशेष रूप से सर्वर-साइड स्क्रिप्ट के लिए। हालांकि दे घुमा केअधिक अभिव्यक्तिपूर्ण है, पानी का छींटा काफी तेजी से चलता है और अधिक सुरक्षित है। - Rick-777
@ रिक -777 तो क्या मुझे अपनी स्क्रिप्ट के शीर्ष पर स्पष्ट रूप से #! / Bin / dash रखना चाहिए? मैंने स्क्रिप्ट लिखी हैं जहां मैं केवल आदेश लिखता हूं और ./scriptName के साथ निष्पादित करता हूं और यह ठीक काम करता है। क्या #! / Bin / yourShell आवश्यक है? - user137717
@ रिक -777 उन मामलों में जहां मैं किसी भी #! / Bin / shellName को बहिष्कृत करता हूं, मैंने फ़ाइल नामनाम नाम दिया है। नाम। क्या वह #! / Bin / sh घोषित किए बिना पसंदीदा सिस्टम खोल से निहित रूप से लिंक करेगा? - user137717


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

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

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

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

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

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

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

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

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

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

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

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

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


62
2018-05-25 08:31





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

वहाँ से बैश (1) मैन पेज :

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

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

 exec  > >(tee logfile.txt)

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


15
2018-01-14 11:24