बैश और श में क्या अंतर है?


28

मुझे दो प्रकार के कोड का उपयोग होता दिखाई दे रहा है:

#!/usr/bin/sh

तथा:

#!/user/bin/bash

मैंने इसके लिए ऑनलाइन खोज की और राय बहुत भिन्न है। अधिकांश वेबसाइटों पर मैंने जो स्पष्टीकरण देखा , वह कहता है कि shपुराने की तुलना में पुराना है bash, और कोई वास्तविक अंतर नहीं है।

क्या किसी को इन के बीच अंतर पता है? क्या आप मुझे एक व्यावहारिक उदाहरण दे सकते हैं जब एक से दूसरे का उपयोग करना है?


विभिन्न गोले के ऊपर एक सामान्य अवलोकन के लिए (न केवल shऔर bash): http://en.wikipedia.org/wiki/Comparison_of_command_shells
अकीरा

1
यहाँ एक और महान इतिहास: faqs.org/faqs/unix-faq/shell/shell-differences
जॉन राइट

जवाबों:


34

bashका सुपरसेट है sh। सब कुछ आप में shकर सकते हैं आप कर सकते हैं bash

बैश में अधिक विशेषताएं हैं (ब्रांचिंग, बिल्डिंस, सरणियां) स्क्रिप्ट को लिखना आसान है। कुछ बाद में * nix'es के /bin/shलिंक के रूप में है/bin/bash

यहाँ एक ट्यूटोरियल की पूरी व्याख्या के लिए


5
@ सैफ बेंच: एक कारण जो बॉर्न शेल ( sh) को बढ़ाया नहीं गया था वह यह है कि बाश 'को किसी और ने लिखा था। इसके अलावा, मुझे लगता है कि लाइसेंस के मुद्दे थे। बॉर्न शैल के बारे में लेख पढ़ें en.wikipedia.org/wiki/Bourne_shell
फेलिक्स

7
हटाने से shबहुत सारी स्क्रिप्ट्स टूट जाएंगी, जो इसे होने की उम्मीद करती हैं और जिस तरह से यह चीजों को पार्स करती है, उस पर भरोसा करती है। लिनक्स उपयोगकर्ता परवाह नहीं कर सकते हैं, लेकिन सोलारिस, AIX या HP-UX पर $ $ हजारों खर्च करने वाले लोग बहुत नाराज हो सकते हैं।
njd

3
... और भी अधिक मज़ेदार, उबंटू सिम्बलिंक्स / बिन / श टू डैश। डैश पूरी तरह से sh या bash कंप्लेंट नहीं है, लेकिन इसे तेजी से शुरू करना है। जब सिस्टम बूट हो रहा होता है, सभी init.d स्क्रिप्ट चलती है और मुझे लगता है कि कुल मिलाकर बचा हुआ समय इसके लायक है।
kbyrd

8
मुझे पूरा यकीन है कि डैश पूरी तरह से शालीन है। समस्या यह है कि कुछ लोग स्क्रिप्ट लिखते हैं जो कहते हैं / बिन / श, लेकिन स्क्रिप्ट को स्वयं काम करने के लिए / बिन / बैश की आवश्यकता होती है। कोई भी किसी समस्या को नोटिस नहीं करता है, क्योंकि ज्यादातर समय, बिन / श / बस / बिन / बैश पर इंगित करता है।
डावर

8
@ सैफ: एक और कारण है कि shबस विस्तार नहीं किया गया था: इसका स्रोत कोड शुद्ध नरक है। जरा देखो तो। यह माना जाता है कि C ...
ग्रेविटी

6

परंपरागत रूप से, / बिन / श मूल बोर्न शेल होता, जिसका कोई इतिहास या कमांड-लाइन संपादन नहीं होता है, और कोई नौकरी नियंत्रण नहीं होता है।

लगभग 15 वर्षों तक, ज्यादातर यूनिक्स में POSIX शेल स्थापित है, या कम से कम ksh या bash (जो बहुत लगभग POSIX जैसे हैं), लेकिन फिर भी / bin / sh में अधिक सीमित शेल है

इसका कारण यह है कि पुराने शेल स्क्रिप्ट जो उम्मीद करते हैं कि पुराने shकमांड अभी भी काम करेंगे।
चूँकि पात्रों को पसंद किया जाता है {, }और !उन्हें काटने के लिए विशेष अर्थ होता है, इसलिए संभव है कि उन वर्णों का उपयोग करके (उनसे बचकर) बिना एक पुरानी शेल स्क्रिप्ट विफल हो सकती है।
(बॉर्न शेल !!{1,2}शाब्दिक रूप से लिया जाएगा, जबकि बैश व्याख्या करेगा कि पिछली कमांड के दोहराव के रूप में ( !!) एक ब्रेस-विस्तार के बाद)।

लिनक्स पर, shकमांड हमेशा लगभग bashसभी सुविधाओं के साथ एक लिंक है।


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

4

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

bashref में बैश और बॉर्न गोले के बीच अंतर की एक सूची है । पॉश मोड में बैश लगानेman bash पर परिवर्तनों की एक सूची है

/ बिन / श, ओएस एक्स पर एक सिमलिंक या हार्ड लिंक नहीं है, लेकिन यह लगभग समान आकार / बिन / बैश है:

$ ls -li /bin/{ba,}sh
29631757 -r-xr-xr-x  1 root  wheel  1333920 Jul 26 01:52 /bin/bash
29631758 -r-xr-xr-x  1 root  wheel  1334000 Jul 26 01:52 /bin/sh

आदमी बैश :

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

बॉर्न गोले की नकल अन्यथा बहुत सीमित है। bash +B(बॉर्न) वास्तव में ब्रेस विस्तार जैसी सुविधाओं को अक्षम कर देगा।

$ sh
$ echo {a,b}
a b
$ echo $BASH_VERSION
3.2.48(1)-release
$ bash +B
$ echo {a,b}
{a,b}

लेकिन भले ही आप POSIX मोड को अक्षम कर दें, लेकिन गूंज echo -eडिफ़ॉल्ट रूप से व्यवहार करता है :

$ sh
$ shopt -uo posix
$ echo '1\b2'
2

उबंटू पर / बिन / श पानी का छींटा है , इसलिए कुछ बशीज़ ओएस एक्स पर / बिन / श के साथ काम करते हैं लेकिन उबंटू नहीं।

यदि आप वास्तव में मूल बॉर्न गोले के लिए (कुछ इस तरह) स्क्रिप्ट लिखना चाहते हैं, तो आप #!/usr/bin/env bash +Bइसके बजाय उपयोग कर सकते हैं ।

मुझे लगता है कि पॉश विनिर्देशों या बॉर्न गोले का हिस्सा नहीं हैं या अन्य गोले के साथ सब कुछ परीक्षण करने की सुविधाओं से बचने के लिए बैश के लिए स्क्रिप्ट लिखना आसान है।


2

वास्तव में, भले ही / बिन / श / / बिन / बैश की एक कड़ी हो, अगर श के रूप में शुरू किया जाए तो यह अलग तरह से व्यवहार करता है। बैश मैनपेज से:

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

इसलिए sh, यह ऐतिहासिक श व्यवहार का अनुकरण करने की कोशिश करता है। के रूप में bash, यह एक इंटरैक्टिव लॉगिन खोल के रूप में संभव के रूप में उपयोगी होने की कोशिश करता है।


2

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


2
किसी आपात स्थिति में भी उपयोगी हो सकता है यदि आपने किसी के साथ कुछ बुरा किया है ldconfigया आपकी /libनिर्देशिका किसी कारण से मिटा दी गई है।
लॉरेंस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.