मैं सोच रहा हूं कि sh
प्रतीकात्मक होने का क्या मतलब dash
है? मुझे लगता है कि dash
माना जाता है कि यह तेजी से होने वाला है bash
, लेकिन मैं अनिश्चित हूं कि मूल sh
शेल क्यों मौजूद नहीं है sh
।
या अगर कुछ भी क्यों नहीं sh
जुड़ा हुआ है bash
?
मैं सोच रहा हूं कि sh
प्रतीकात्मक होने का क्या मतलब dash
है? मुझे लगता है कि dash
माना जाता है कि यह तेजी से होने वाला है bash
, लेकिन मैं अनिश्चित हूं कि मूल sh
शेल क्यों मौजूद नहीं है sh
।
या अगर कुछ भी क्यों नहीं sh
जुड़ा हुआ है bash
?
जवाबों:
"क्यों मूल श खोल मौजूद नहीं है" का संक्षिप्त उत्तर यह sh
है कि मूल श नहीं है।
ठीक है, ठीक है, वहाँ है: यह थॉम्पसन खोल है । संस्करण 1 में कुछ विशेषताएं थीं जो आज हम जानते हैं, विशेष रूप से पुनर्निर्देशन और पाइप में ( शुरुआती यूनिक्स पर डेनिस रिची का पेपर पढ़ें )। बाद के संस्करणों में बैकग्राउंड निष्पादन &
, ग्लोबिंग (बाहरी प्रोग्राम के साथ कार्यान्वित), और कुछ प्रकार के उद्धरण जैसे फीचर्स जोड़े गए , लेकिन इसमें चर या नेस्टेड नियंत्रण संरचना नहीं थी। सशर्त और छोरों को बाहरी कार्यक्रमों if
(जो एक शर्त और एक आदेश को तर्क के रूप में लिया गया था) के माध्यम से प्रदान goto
किया गया था ( और जो स्क्रिप्ट फ़ाइल में अपने माता-पिता की फ़ाइल स्थिति को बदलकर काम करता है)।
1979 में, में यूनिक्स V7 , थॉम्पसन शेल के रूप में बदल दिया गया था /bin/sh
द्वारा बॉर्न शैल । पहले रिलीज में पहले से ही कई विशेषताएं थीं जो आज डैश में मौजूद हैं, और बाद के संस्करणों ने कई और पेश किए । कुछ साल बाद, कर्न शेल एक बढ़ते फीचर सेट के साथ, दृश्य पर आया; कई यूनिक्स वेरिएंट ने नाम के तहत इसे स्थापित किया ksh
।
1992 में, POSIX ने sh
सुविधाओं के एक न्यूनतम सेट को संहिताबद्ध किया जो मूल रूप से बॉर्न प्लस कुछ चीजें थीं। खुद को "यूनिक्स" कहने वाली किसी भी प्रणाली को कम से कम इन विशेषताओं को लागू करना था। वाणिज्यिक यूनिक्स सिस्टम आमतौर पर पीओएसएक्स श के रूप में क्श का उपयोग करते थे, लेकिन कुछ (जैसे ओएसएफ / 1 ) का अपना था।
न तो बॉर्न शेल और न ही कोर्न शेल काफी समय पहले तक खुला स्रोत था, इसलिए जब 1990 के दशक के मध्य में लिनक्स दुनिया बनने लगी, तो वे उपलब्ध नहीं थे। /bin/sh
कुछ और होना था। अधिकांश लिनक्स वितरण bash के लिए गए , GNU प्रोजेक्ट का एक शेल जो स्क्रिप्टिंग फीचर्स के मामले में बॉर्न और कॉर्न के बीच था, और इंटरेक्टिव उपयोग के लिए या तो बेहतर था)। एकमात्र व्यवहार्य विकल्प pdksh था ("सार्वजनिक डोमेन Korn खोल"), एक मुफ़्त (अब बंद, लेकिन mksh के रूप में रह रहा है , जो सक्रिय रूप से विकसित है ), लेकिन मुझे pdksh के रूप में लिनक्स वितरण का याद नहीं है/bin/sh
, मुझे पता नहीं क्यों, मुझे लगता है क्योंकि लिनक्स वितरण हमेशा जीएनयू / लिनक्स वितरण थे, मूल रूप से किसी भी उपकरण के जीएनयू संस्करणों को शिपिंग करते हैं जिसके लिए एक जीएनयू संस्करण मौजूद था।
sh
"राख" नामक कई खुले स्रोत कार्यान्वयन भी थे , विशेष रूप से अल्मक्विस्ट शेल , लेकिन वे बहुत अधूरे थे, जिनमें कुछ पोसिक्स सुविधाओं का अभाव था जो लोग उपयोग करना चाहते थे। एक प्रोग्रामर जो एक डेबियन अनुरक्षक, हर्बर्ट जू था , उसने पॉसिक्स को आज्ञाकारी बनाने के लिए राख को बढ़ाया। अंततः उसके संस्करण को डैश में बदल दिया गया, और /bin/sh
बैश के बजाय इसे डेबियन में बनाने के लिए कुछ धक्का दिया गया । डेबियन ने बशिस्म ( #!/bin/sh
स्क्रिप्ट में बाश-विशिष्ट कार्यक्षमता का उपयोग ) को कीड़े के रूप में व्यवस्थित रूप से व्यवहार करने से पहले शुरू किया । दोनों ने बाद में 2009 में केवल उबंटू ( उबंटू 6.10 , डेबियन को बदल दिया ) यह एक लक्ष्य था लेकिन स्विच केवल पैसा जारी करने के बाद (निचोड़ में) बनाया गया था))।
एक प्रमुख पानी का छींटा के रूप में करने के बजाय पार्टी का उपयोग कर के लिए कारण के रूप में /bin/sh
है कि यह काफी तेजी है। यह उबंटू के लिए विशेष रूप से महत्वपूर्ण था, जिसने शुरुआत से ही बूट समय को कम रखने के लिए स्ट्राइक किया है। डैश बैश की तुलना में कम मेमोरी का उपयोग करने के लिए जाता है, जो आवरण लिपियों के लिए कुछ महत्वपूर्ण है जो अंतर्निहित प्रोग्राम से बाहर निकलने पर बस थोड़ी सी सफाई करने के लिए आसपास रहते हैं। डैश का एक अन्य लाभ यह है कि यह केवल libc (कोर सिस्टम लाइब्रेरी) पर निर्भर करता है जबकि bash टर्मिनल सपोर्ट लाइब्रेरी पर भी निर्भर करता है (यह उनके बिना शुरू नहीं हो सकता, यहां तक कि स्क्रिप्ट चलाने के लिए भी); इसका मतलब है कि डैश के पास टूटी हुई प्रणाली पर काम करने का बेहतर मौका है।
21 वीं सदी के दौरान कुछ बिंदु पर, कोर्न शेल खुला स्रोत चला गया, और बॉर्न शेल के खुले स्रोत संस्करण दिखाई दिए (पुराने संस्करण, क्योंकि विकास वर्षों पहले बंद हो गया था)। लेकिन डैश और बैश को किसी भी तरह की स्वीकृति हासिल करने के लिए लिनक्स की दुनिया में बहुत मजबूती से घेर लिया गया था, खासकर बॉर्न शेल क्योंकि इसका मूल्य आज केवल ऐतिहासिक है। डैश ने बैश को विस्थापित कर दिया क्योंकि इसके स्पष्ट लाभ थे, लेकिन अन्य दावेदारों में से किसी के पास भी कोई निर्णायक लाभ नहीं है /bin/sh
।
system
(3) जो एप्लिकेशन बनाते हैं) प्रमुख कारक है।
गति और POSIX अनुपालन (दूसरे शब्दों में, पोर्टेबिलिटी) मुख्य कारक हैं। याद रखें कि /bin/sh
सिस्टम स्क्रिप्ट के लिए है, जो उबंटू और / या अन्य प्रणालियों के पुराने संस्करणों से आया हो सकता है या नहीं।
निश्चित रूप से, चमकदार विशेषताएं bash
हमारे उपयोगकर्ताओं के लिए उपयोग करने के लिए शांत हैं, लेकिन जब यह पर्यावरण में चलने वाली चीज की बात आती है, जहां आपको कई अलग-अलग सर्वर / सिस्टम का प्रबंधन करना पड़ता है - POSIX अनुरूप शेल होने से पूरे बहुत अंतर होता है। विशेष रूप से, यदि आप एक नए sysadmin और विरासत में मिले वातावरण के साथ कई लिपियों में हैं।
मूल बॉर्न शेल क्यों मौजूद नहीं है, इसके लिए यह सरल है - यह मूल रूप से एटी एंड टी बेल लैब्स के स्वामित्व वाला एक मालिकाना उत्पाद है।
इसके अलावा, इसके बारे में उबंटू विकि पर वास्तव में एक स्पष्ट व्याख्या है:
यह बदलाव क्यों किया गया? डिफ़ॉल्ट शेल को स्विच करने का प्रमुख कारण दक्षता थी। बैश इंटरैक्टिव उपयोग के लिए उपयुक्त एक उत्कृष्ट पूर्ण विशेषताओं वाला खोल है; वास्तव में, यह अभी भी डिफ़ॉल्ट लॉगिन शेल है। हालांकि, यह डैश के साथ तुलना करके शुरू करने और संचालित करने के लिए बड़ा और धीमा है। उबंटू बूट प्रक्रिया के हिस्से के रूप में बड़ी संख्या में शेल इंस्टेंस शुरू किए जाते हैं। स्पष्ट रूप से / बिन / डैश के तहत चलाने के लिए उनमें से प्रत्येक को व्यक्तिगत रूप से बदलने के बजाय, एक परिवर्तन जिसे महत्वपूर्ण चल रहे रखरखाव की आवश्यकता होगी और जो कि यदि ध्यान नहीं दिया गया तो इसे पुनः प्राप्त करने के लिए उत्तरदायी होगा, उबंटू कोर विकास टीम ने महसूस किया कि इसे बदलने के लिए बस सबसे अच्छा था डिफ़ॉल्ट शेल। उबंटू 6.10 में बूट गति में सुधार को अक्सर अपस्टार्ट के लिए गलत तरीके से जिम्मेदार ठहराया गया था, जो कि इनिट सिस्टम के भविष्य के विकास के लिए एक अच्छा मंच है लेकिन उबंटू 6 में है। 10 मुख्य रूप से केवल छोटे व्यवहार परिवर्तन के साथ सिस्टम V संगतता मोड में चल रहा था। ये सुधार वास्तव में परिवर्तित / बिन / श के कारण थे।
और यहाँ पोर्टेबिलिटी के बारे में एक नोट है:
डेबियन नीति नियमावली ने लंबे समय से कहा है कि "शेल स्क्रिप्ट्स '/ बिन / श' को निर्दिष्ट करती है क्योंकि दुभाषिया को केवल पॉसिक्स का उपयोग करना चाहिए"; वास्तव में, यह आवश्यकता उबंटू परियोजना की स्थापना से पहले से ही है। इसके अलावा, कोई भी शेल स्क्रिप्ट जो अन्य यूनिक्स प्रणालियों जैसे कि बीएसडी या सोलारिस के लिए पोर्टेबल होने की उम्मीद थी, ने पहले ही इस आवश्यकता को सम्मानित किया। इस प्रकार, हमें लगा कि इस परिवर्तन का संगतता प्रभाव न्यूनतम होगा।
dash
विशेषताओं का समर्थन नहीं करता जिनके लिए आवश्यक नहीं है POSIX
?
जीएनयू / लिनक्स वितरण में, "मूल /bin/sh
" वास्तव में बैश है।
जीएनयू एक बॉर्न-जैसा शेल चाहता था जो जीपीएल के तहत था, इसलिए उन्होंने /bin/sh
बॉर्न के बजाय बैश को चुना , जो जीपीएल-लाइसेंस प्राप्त नहीं था। आधुनिक लिनक्स डिस्ट्रोस ने इस निर्णय को इस बात के लिए विरासत में दिया कि यह /bin/sh
बैश होने के लिए एक रक्षात्मक मानक बन गया । मूल बॉर्न शेल ("श") का उपयोग अन्य गैर-लिनक्स यूनिक्स में किया गया है, यहां तक कि हाल ही में सोलारिस 10 के रूप में, लेकिन यह लिनक्स वितरण में कभी भी मुख्य आधार नहीं रहा है।
/bin/sh
बैश से डैश पर स्विच करना एक डेबियन निर्णय था (उबंटू से विरासत में मिला) काफी हद तक गति से प्रेरित था - यह एक समय आया जब उन्होंने बूट गति में सुधार करने के लिए एक बड़ा प्रयास किया, और चलने के समय बूट सीपीयू समय का एक बड़ा हिस्सा लगातार बना रहा। init स्क्रिप्ट।
बैश का उपयोग उपयोगकर्ताओं के लिए डिफ़ॉल्ट इंटरेक्टिव / लॉगिन शेल के रूप में किया जाता है, लेकिन डैश एक है /bin/sh
और जिसे सिस्टम स्क्रिप्ट जैसे init स्क्रिप्ट के लिए निष्पादित किया जाता है।
पानी का छींटा बहुत तेज है, लेकिन यह भी बहुत बारीकी से पॉस-संगत है - एक मानक जो बॉर्न शेल के साथ निकटता से जुड़ा हुआ है। तो एक तरह से, बैश से डैश तक स्विच करके हम बॉर्न के साथ गठबंधन किए गए एक शेल पर वापस जा रहे हैं।
ksh
, मैं कहूंगा। मुझे याद नहीं है कि बॉर्न शेल में अंकगणितीय विस्तार `$ (())`, जो कि POSIX है।
^
एक पाइप चरित्र है - तो पोसिक्स श में निकल echo foo ^ cat
जाएगा foo ^ cat
, लेकिन foo
बॉर्न में; यह विशिष्ट परीक्षण है कि ऑटोकॉन्फ़ दो को अलग कैसे बताता है।
/bin/sh
/bin/dash
मुझे लगता है कि अनुकूलता के कारणों से जुड़ा हुआ है । कई स्क्रिप्ट बस से शुरू होती हैं
#!/bin/sh
इसलिए dash
प्रतीकात्मक लिंक बनाने और न ले जाने से , बहुत सारी स्क्रिप्ट ठीक से (या बिल्कुल भी) चलने में विफल होंगी, अगर /bin/sh
वे बिल्कुल भी मौजूद नहीं थीं।
परिवर्तन से बनाया गया था bash
करने के लिए dash
के अनुसार क्योंकि https://wiki.ubuntu.com/DashAsBinSh :
डिफ़ॉल्ट शेल को स्विच करने का प्रमुख कारण दक्षता थी। बैश इंटरैक्टिव उपयोग के लिए उपयुक्त एक उत्कृष्ट पूर्ण विशेषताओं वाला खोल है; वास्तव में, यह अभी भी डिफ़ॉल्ट लॉगिन शेल है। हालांकि, यह डैश के साथ तुलना करके शुरू करने और संचालित करने के लिए बड़ा और धीमा है। उबंटू बूट प्रक्रिया के हिस्से के रूप में बड़ी संख्या में शेल इंस्टेंस शुरू किए जाते हैं। स्पष्ट रूप से / बिन / डैश के तहत चलाने के लिए उनमें से प्रत्येक को व्यक्तिगत रूप से बदलने के बजाय, एक परिवर्तन जिसे महत्वपूर्ण चल रहे रखरखाव की आवश्यकता होगी और जिसे फिर से ध्यान देने के लिए उत्तरदायी होगा यदि उबंटू कोर विकास टीम ने महसूस किया कि यह बस बदलना सबसे अच्छा था डिफ़ॉल्ट शेल।
sh
से जुड़ा नहीं है bash
, क्योंकि
डेबियन नीति नियमावली ने लंबे समय से यह आदेश दिया है कि "शेल स्क्रिप्ट्स '/ बिन / श' को निर्दिष्ट करती है क्योंकि दुभाषिए को केवल PIXIX का उपयोग करना चाहिए"
यदि आप उपयोग करना चाहते हैं bash
के रूप में /bin/sh
:
यदि समस्याएं अधिक व्यापक हैं और आप डिफ़ॉल्ट सिस्टम शेल को वापस बदलना चाहते हैं, तो आप पैकेज प्रबंधन प्रणाली को डैश / / श के रूप में इंस्टाल करने से रोकने का निर्देश दे सकते हैं:
sudo dpkg-reconfigure dash
कुछ विशेषताएं हैं जो dash
प्रदान करती हैं कि बैश नहीं है, जैसे:
वहाँ भी एक मौका है कि वहाँ कुछ स्क्रिप्ट है कि अब पानी का छींटा की कुछ सुविधा पर निर्भर करता है कि मारना प्रदान नहीं करता है!
sh
को खराब /bin/sh
करेगा?
/bin/sh
वितरण द्वारा प्रदान किए गए शेल के रूप में छोड़ देना चाहिए , जैसा कि उन्होंने अपने बूट स्क्रिप्ट और इस तरह लक्षित किया है। लेकिन अगर आपने इसे बॉर्न से बदल दिया, तो यह ज्यादातर संगत होगा। मुझे लगता है कि वहाँ कोड के बनाम केवल राशि के अंतर के कारण टूटना होगा। बेशक आप एक कस्टम हैशबैंग के साथ अपनी खुद की स्क्रिप्ट में जो भी खोल का उपयोग करने के लिए स्वतंत्र हैं।
/bin/sh
लिंक से अलग है, जिससे किसी विशेष उपयोगकर्ता ने अपने शुरुआती लॉगिन शेल के रूप में सेट किया है। इसका लक्ष्य इस /bin/sh
बात पर निर्भर नहीं करता है कि कौन सा उपयोगकर्ता देख रहा है, और आपको इसे बदलने के लिए मूल उपयोगकर्ता के रूप में अभिनय के कुछ अन्य साधनों का उपयोग करने की आवश्यकता sudo
है। इसके अलावा, सामान्य रूप से और किसी भी पैकेज के लिए, dpkg-reconfigure
रूट के रूप में चलाया जाना चाहिए। इसके विपरीत, उपयोगकर्ताओं को आमतौर पर अपने स्वयं के शुरुआती लॉगिन शेल को बदलने की अनुमति दी जाती है और chsh
कमांड के साथ ऐसा कर सकते हैं । किसी के शुरुआती लॉगिन शेल का नाम भी अंदर जाता है $SHELL
और कुछ इंटरेक्टिव नॉन-लॉगिन शेल के लिए भी उपयोग किया जाता है।