श को डैश से जोड़ने की बात क्या है?


36

मैं सोच रहा हूं कि shप्रतीकात्मक होने का क्या मतलब dashहै? मुझे लगता है कि dashमाना जाता है कि यह तेजी से होने वाला है bash, लेकिन मैं अनिश्चित हूं कि मूल shशेल क्यों मौजूद नहीं है sh

या अगर कुछ भी क्यों नहीं shजुड़ा हुआ है bash?

जवाबों:


72

"क्यों मूल श खोल मौजूद नहीं है" का संक्षिप्त उत्तर यह 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


मेरा तर्क है कि ksh93 को / bin / sh के रूप में उपयोग करने के अच्छे कारण हैं - यह उच्चतम-प्रदर्शन POSIX गोले में से एक है। सहमत हैं कि डैश की सर्वव्यापकता समय की बात है।
चार्ल्स डफी

2
@CharlesDuffy Ksh93 जटिल सामान करने में तेज़ है, लेकिन डैश इसे स्टार्टअप समय के लिए, और सरल स्क्रिप्ट के लिए (जैसे कि सभी कॉल के लिए system(3) जो एप्लिकेशन बनाते हैं) प्रमुख कारक है।
गाइल्स 'एसओ- बुराई को रोकना'

21

गति और POSIX अनुपालन (दूसरे शब्दों में, पोर्टेबिलिटी) मुख्य कारक हैं। याद रखें कि /bin/shसिस्टम स्क्रिप्ट के लिए है, जो उबंटू और / या अन्य प्रणालियों के पुराने संस्करणों से आया हो सकता है या नहीं।

निश्चित रूप से, चमकदार विशेषताएं bashहमारे उपयोगकर्ताओं के लिए उपयोग करने के लिए शांत हैं, लेकिन जब यह पर्यावरण में चलने वाली चीज की बात आती है, जहां आपको कई अलग-अलग सर्वर / सिस्टम का प्रबंधन करना पड़ता है - POSIX अनुरूप शेल होने से पूरे बहुत अंतर होता है। विशेष रूप से, यदि आप एक नए sysadmin और विरासत में मिले वातावरण के साथ कई लिपियों में हैं।

मूल बॉर्न शेल क्यों मौजूद नहीं है, इसके लिए यह सरल है - यह मूल रूप से एटी एंड टी बेल लैब्स के स्वामित्व वाला एक मालिकाना उत्पाद है।

इसके अलावा, इसके बारे में उबंटू विकि पर वास्तव में एक स्पष्ट व्याख्या है:

यह बदलाव क्यों किया गया? डिफ़ॉल्ट शेल को स्विच करने का प्रमुख कारण दक्षता थी। बैश इंटरैक्टिव उपयोग के लिए उपयुक्त एक उत्कृष्ट पूर्ण विशेषताओं वाला खोल है; वास्तव में, यह अभी भी डिफ़ॉल्ट लॉगिन शेल है। हालांकि, यह डैश के साथ तुलना करके शुरू करने और संचालित करने के लिए बड़ा और धीमा है। उबंटू बूट प्रक्रिया के हिस्से के रूप में बड़ी संख्या में शेल इंस्टेंस शुरू किए जाते हैं। स्पष्ट रूप से / बिन / डैश के तहत चलाने के लिए उनमें से प्रत्येक को व्यक्तिगत रूप से बदलने के बजाय, एक परिवर्तन जिसे महत्वपूर्ण चल रहे रखरखाव की आवश्यकता होगी और जो कि यदि ध्यान नहीं दिया गया तो इसे पुनः प्राप्त करने के लिए उत्तरदायी होगा, उबंटू कोर विकास टीम ने महसूस किया कि इसे बदलने के लिए बस सबसे अच्छा था डिफ़ॉल्ट शेल। उबंटू 6.10 में बूट गति में सुधार को अक्सर अपस्टार्ट के लिए गलत तरीके से जिम्मेदार ठहराया गया था, जो कि इनिट सिस्टम के भविष्य के विकास के लिए एक अच्छा मंच है लेकिन उबंटू 6 में है। 10 मुख्य रूप से केवल छोटे व्यवहार परिवर्तन के साथ सिस्टम V संगतता मोड में चल रहा था। ये सुधार वास्तव में परिवर्तित / बिन / श के कारण थे।

और यहाँ पोर्टेबिलिटी के बारे में एक नोट है:

डेबियन नीति नियमावली ने लंबे समय से कहा है कि "शेल स्क्रिप्ट्स '/ बिन / श' को निर्दिष्ट करती है क्योंकि दुभाषिया को केवल पॉसिक्स का उपयोग करना चाहिए"; वास्तव में, यह आवश्यकता उबंटू परियोजना की स्थापना से पहले से ही है। इसके अलावा, कोई भी शेल स्क्रिप्ट जो अन्य यूनिक्स प्रणालियों जैसे कि बीएसडी या सोलारिस के लिए पोर्टेबल होने की उम्मीद थी, ने पहले ही इस आवश्यकता को सम्मानित किया। इस प्रकार, हमें लगा कि इस परिवर्तन का संगतता प्रभाव न्यूनतम होगा।

Https://wiki.ubuntu.com/DashAsBinSh देखें


उन dashविशेषताओं का समर्थन नहीं करता जिनके लिए आवश्यक नहीं है POSIX?
NerdOfLinux

@NerdOfLinux यह वास्तव में कोई फर्क नहीं पड़ता कि POSIX के अलावा क्या / बिन / श समर्थन करता है (जब तक कि वे जोड़ POSIX स्क्रिप्ट को नहीं तोड़ते); महत्वपूर्ण बात यह है कि यह सब कुछ POSIX का समर्थन करता है (और जितनी जल्दी हो सके)। जब तक पानी का छींटा इन आवश्यकताओं को पूरा करता है, तब तक / बिन / श इससे लिंक कर सकता है।
गुंट्रम ब्लोम

9

जीएनयू / लिनक्स वितरण में, "मूल /bin/sh" वास्तव में बैश है।

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

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

बैश का उपयोग उपयोगकर्ताओं के लिए डिफ़ॉल्ट इंटरेक्टिव / लॉगिन शेल के रूप में किया जाता है, लेकिन डैश एक है /bin/shऔर जिसे सिस्टम स्क्रिप्ट जैसे init स्क्रिप्ट के लिए निष्पादित किया जाता है।

पानी का छींटा बहुत तेज है, लेकिन यह भी बहुत बारीकी से पॉस-संगत है - एक मानक जो बॉर्न शेल के साथ निकटता से जुड़ा हुआ है। तो एक तरह से, बैश से डैश तक स्विच करके हम बॉर्न के साथ गठबंधन किए गए एक शेल पर वापस जा रहे हैं।


"पानी का छींटा बहुत तेज है, लेकिन यह भी बहुत करीब से पॉसिक्स-संगत है - एक मानक जो बॉर्न शेल के साथ निकटता से जुड़ा हुआ है।" हां, हालांकि पोसिक्स अधिक निकटता से संबंधित है ksh, मैं कहूंगा। मुझे याद नहीं है कि बॉर्न शेल में अंकगणितीय विस्तार `$ (())`, जो कि POSIX है।
सर्गी कोलोडियाज़नी

1
इसके अलावा, बॉर्न में, ^एक पाइप चरित्र है - तो पोसिक्स श में निकल echo foo ^ catजाएगा foo ^ cat, लेकिन fooबॉर्न में; यह विशिष्ट परीक्षण है कि ऑटोकॉन्फ़ दो को अलग कैसे बताता है।
चार्ल्स डफी

दिलचस्प है, तो POSIX श से आपका मतलब है कोर्न?
थॉमसनाटर

0

/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प्रदान करती हैं कि बैश नहीं है, जैसे:

वहाँ भी एक मौका है कि वहाँ कुछ स्क्रिप्ट है कि अब पानी का छींटा की कुछ सुविधा पर निर्भर करता है कि मारना प्रदान नहीं करता है!


मैं पहले से ही समझ में आया कि संगतता एक कारक हो सकती है, लेकिन मैं गहराई से जवाब में इतना स्पष्ट और अधिक नहीं देख रहा था ...
NerdOfCode

2
तो अगर मैं करने के लिए मूल बोर्न शेल स्थापित करने के लिए थे , क्या यह उन बूट स्क्रिप्ट shको खराब /bin/shकरेगा?
मिठाई

शायद असली दुनिया में तैनात होने से पहले पहली बार एक आभासी मशीन में यह कोशिश करने के लिए सबसे अच्छा हो ...
NerdOfCode

2
आपको /bin/shवितरण द्वारा प्रदान किए गए शेल के रूप में छोड़ देना चाहिए , जैसा कि उन्होंने अपने बूट स्क्रिप्ट और इस तरह लक्षित किया है। लेकिन अगर आपने इसे बॉर्न से बदल दिया, तो यह ज्यादातर संगत होगा। मुझे लगता है कि वहाँ कोड के बनाम केवल राशि के अंतर के कारण टूटना होगा। बेशक आप एक कस्टम हैशबैंग के साथ अपनी खुद की स्क्रिप्ट में जो भी खोल का उपयोग करने के लिए स्वतंत्र हैं।
थोमसट्रेटर

1
@mckenzm किस शेल /bin/shलिंक से अलग है, जिससे किसी विशेष उपयोगकर्ता ने अपने शुरुआती लॉगिन शेल के रूप में सेट किया है। इसका लक्ष्य इस /bin/shबात पर निर्भर नहीं करता है कि कौन सा उपयोगकर्ता देख रहा है, और आपको इसे बदलने के लिए मूल उपयोगकर्ता के रूप में अभिनय के कुछ अन्य साधनों का उपयोग करने की आवश्यकता sudoहै। इसके अलावा, सामान्य रूप से और किसी भी पैकेज के लिए, dpkg-reconfigureरूट के रूप में चलाया जाना चाहिए। इसके विपरीत, उपयोगकर्ताओं को आमतौर पर अपने स्वयं के शुरुआती लॉगिन शेल को बदलने की अनुमति दी जाती है और chshकमांड के साथ ऐसा कर सकते हैं । किसी के शुरुआती लॉगिन शेल का नाम भी अंदर जाता है $SHELLऔर कुछ इंटरेक्टिव नॉन-लॉगिन शेल के लिए भी उपयोग किया जाता है।
एलिया कगन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.