2008-09-16 23 views
51

मैं * निक्स के लिए नया नहीं हूं, हालांकि हाल ही में मैं प्रॉम्प्ट पर बहुत समय बिता रहा हूं। मेरा सवाल है कि कॉर्नशेल (केश) या बैश शैल का उपयोग करने के क्या फायदे हैं? एक दूसरे पर एक का उपयोग करने के नुकसान कहाँ हैं?बैश या कॉर्नशेल (ksh)?

पूरी तरह से स्क्रिप्टिंग के बजाए उपयोगकर्ता के परिप्रेक्ष्य से समझना चाहते हैं।

उत्तर

41

बैश।

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

कम से कम बैश के साथ आप यह सुनिश्चित कर सकते हैं कि यह एक कोड कोड है, और आपको चिंता करने की आवश्यकता है कि बैश का क्या (आमतौर पर न्यूनतम) संस्करण स्थापित होता है। हर आधुनिक (और आधुनिक नहीं) यूनिक्स पर बहुत अधिक स्क्रिप्टिंग करने के बाद, बैश करने के लिए प्रोग्रामिंग मेरे अनुभव में अधिक विश्वसनीय रूप से सुसंगत है।

+0

यदि आप केवल न्यूनतम-आम-denominator ksh कर रहे हैं, तो मैं सहमत होगा। दूसरी ओर, वास्तविक डेविड कॉर्न ksh93, स्क्रिप्टिंग के लिए आकर्षक फायदे हैं: गति जो पाठ प्रसंस्करण के लिए 'awk' के पास रखती है; देशी फ्लोटिंग पॉइंट गणित; सिस्टम पर भी नामकरण और सहयोगी सरणी नवीनतम रिलीज नहीं चला रहे हैं; इत्यादि –

0

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

दुर्भाग्यवश, मैं वास्तव में गोले के बीच वास्तविक प्रोग्रामिंग अंतर को संबोधित नहीं कर सकता।

+1

यदि आप स्क्रिप्ट वितरित करने की योजना बना रहे हैं तो posix-sh का उपयोग करें। बैश एक अच्छा खोल है, और लिनक्स पर डिफ़ॉल्ट है। पुराने यूनिक्स स्वाद में sh, ksh, और csh होते हैं। एक उत्पादन वातावरण में, सभी प्रणालियों पर अपनी पसंद के खोल को स्थापित करने के लिए अनुमति या क्षमा प्राप्त करना मुश्किल हो सकता है। –

+2

यह एईक्स पर डिफ़ॉल्ट रूप से स्थापित नहीं है जिसे हम काम (प्रमुख अमेरिकी वित्तीय संस्थान) पर उपयोग करते हैं, और लड़का चाहता हूं कि यह था। –

2

एक बात के लिए, बैश टैब पूर्ण हो गया है। यह अकेले मुझे ksh पर इसे पसंद करने के लिए पर्याप्त है।

Z shell केश की अनूठी विशेषताओं का एक अच्छा संयोजन है जो अच्छी चीजों के साथ प्रदान करता है, साथ ही इसके ऊपर बहुत अधिक चीजें हैं।

+3

ksh पूरा हो गया है, बस टैब कुंजी के साथ नहीं। – user13158

+2

'ksh --version':" संस्करण sh (एटी एंड टी रिसर्च) 93t + 2009-05-01 "टैब-पूर्णता और एसीसी-पूर्णता है। –

+2

डिफ़ॉल्ट रूप से, केश का उपयोग करता है क्योंकि कोई भी उत्सुक था। स्रोत: http://kornshell.com/doc/faq.html – Katerberg

3

@foxxtrot

वास्तव में, मानक खोल बॉर्न शैल (sh) है। लिनक्स पर /bin/sh वास्तव में bash है, लेकिन यदि आप क्रॉस-प्लेटफ़ॉर्म स्क्रिप्ट के लिए लक्ष्य रखते हैं, तो आप मूल बोर्न शैल की विशेषताओं को चिपकाने या इसे perl जैसे कुछ लिखने से बेहतर हैं।

+0

ध्यान दें कि बैश से जुड़ा हुआ/bin/sh (sym) bash से जुड़ा हुआ है: यदि नाम sh के साथ बैश लगाया जाता है, तो यह स्टार्टअप की नकल करने का प्रयास करता है जितना संभव हो उतना निकट के ऐतिहासिक संस्करणों का व्यवहार, जबकि पॉज़िक्स मानक के अनुरूप भी है। –

+3

डेबियन पर मानक '/ bin/sh' वास्तव में' डैश', डेबियन अल्मक्विस्ट खोल है। यह बहुत से लोगों को surpise द्वारा लेता है जब उनके "वैध" बैश आदेश '#!/Bin/sh' – thom

3

मुझे ksh के साथ अनुभव नहीं है, लेकिन मैंने दोनों बैश और zsh का उपयोग किया है। मैं बहुत शक्तिशाली फ़ाइल globbing, परिवर्तनीय विस्तार modifiers, और तेजी से टैब पूरा करने के लिए इसके समर्थन के कारण zsh over bash पसंद करते हैं।

यहां एक त्वरित परिचय है: http://friedcpu.wordpress.com/2007/07/24/zsh-the-last-shell-youll-ever-need/

3

मेरा जवाब हो 'एक चुनना है और यह कैसे उपयोग करने के लिए सीखना' होगा। वे दोनों सभ्य गोले हैं; बैश में शायद अधिक घंटियाँ और सीटी हैं, लेकिन दोनों में मूलभूत विशेषताएं हैं जो आप चाहेंगे। इन दिनों बैश अधिक सार्वभौमिक रूप से उपलब्ध है। यदि आप हर समय लिनक्स का उपयोग कर रहे हैं, तो बस इसके साथ चिपके रहें।

यदि आप प्रोग्रामिंग कर रहे हैं, पोर्टेबिलिटी के लिए सादा 'sh' पर चिपकने का प्रयास करना अच्छा अभ्यास है, लेकिन फिर इन दिनों इतनी व्यापक रूप से उपलब्ध है कि सलाह थोड़ी पुरानी है।

जानें कि पूरा करने और अपने खोल इतिहास का उपयोग कैसे करें; कभी-कभी मैनपेज पढ़ें और कुछ नई चीजें सीखने का प्रयास करें।

+0

द्वारा अस्वीकार कर दिए जाते हैं इस उत्तर के लेखन के अनुसार, ksh93 तर्कसंगत रूप से एक प्रोग्रामिंग परिप्रेक्ष्य से अधिक घंटियाँ और सीटी (सहयोगी सरणी और नेमवार्स आते हैं) सबसे पहले दिमाग में) - हालांकि यह आठ साल के मध्य में बदल गया है। इसमें अभी भी फ्लोटिंग पॉइंट गणित है, जिसमें कमी की कमी है। –

4

यह यूनिक्स बनाम लिनक्स युद्ध का एक छोटा सा हिस्सा है। अधिकांश यदि सभी लिनक्स वितरण में बैश स्थापित नहीं है और ksh वैकल्पिक है। अधिकांश यूनिक्स सिस्टम, जैसे सोलारिस, एईक्स और एचपीयूएक्स में डिफ़ॉल्ट रूप से ksh है।

व्यक्तिगत रूप से मैं हमेशा केश का उपयोग करता हूं, मुझे वीआई पूरा होने से प्यार है और मैं सब कुछ के लिए सोलारिस का बहुत अधिक उपयोग करता हूं।

+0

एचपी-यूएक्स डिफ़ॉल्ट शैल के रूप में sh, csh, और ksh प्रदान करता है। 11.31 बैश में डिफ़ॉल्ट स्थापना मीडिया पर शामिल किया गया था। लेकिन, अभी भी दुनिया में चल रहे 10.20 की राशि दी गई है, एचएस-यूएक्स को प्रशासित करने के लिए केश अभी भी एक बेहतर शर्त है। –

+0

आप 'set -o vi' के साथ bash में vi पूर्णता का उपयोग कर सकते हैं, और इसे लगातार बनाने के लिए इसे अपनी '~/.bashrc' फ़ाइल में जोड़ सकते हैं। इस तरह मेरे पास मेरा सेट है। – Wildcard

-2

बैश लिनक्स के लिए मानक है।
मेरा अनुभव यह है कि ksh या csh के लिए bash के लिए सहायता ढूंढना आसान है।

+1

मैं कहूंगा कि _bash_ _a_ मानक है। ;-) –

+1

बैश केवल लिनक्स के लिए मानक है। मूल बोर्न शैल (एस) क्रॉस-प्लेटफार्म स्क्रिप्ट के लिए मानक है। –

+2

क्रॉस प्लेटफार्म स्क्रिप्टिंग के लिए पॉज़िक्स-श (या शायद 'होना चाहिए') मानक है। –

4

स्क्रिप्ट के लिए, मैं हमेशा ksh का उपयोग करता हूं क्योंकि यह gotchas से अधिक है।

लेकिन मुझे बैश इंटरैक्टिव उपयोग के लिए अधिक आरामदायक लगता है। मेरे लिए emacs कुंजी बाइंडिंग और टैब पूर्णता मुख्य लाभ हैं। लेकिन यह ज्यादातर आदत का बल है, ksh के साथ कोई तकनीकी समस्या नहीं है।

+0

"इंटरैक्टिव उपयोग" से आपका क्या मतलब है? – amphibient

+1

@foampile: जब आप टर्मिनल कमांड लाइन में टाइप कर रहे हों। ;-) –

+0

मैंने ऐसा सोचा। धन्यवाद – amphibient

25

मैं एक कॉर्न-शैल अनुभवी हूं, इसलिए पता है कि मैं उस परिप्रेक्ष्य से बात करता हूं।

हालांकि, मैं बोर्न शैल, ksh88, और ksh93 के साथ सहज हूं, और मुझे पता है कि कौन सी विशेषताओं का समर्थन किया जाता है।

इंटरैक्टिव उपयोग के लिए, जो भी आपकी आवश्यकता के अनुरूप है ले लो। प्रयोग। मैं इंटरैक्टिव उपयोग और प्रोग्रामिंग के लिए एक ही खोल का उपयोग करने में सक्षम होना पसंद करता हूं।

मैं एसवीआर 2 से टीसीएसएच, ksh88sun और ksh93 पर ksh88 से चला गया। मैंने बैश की कोशिश की, और ने इससे नफरत की क्योंकि यह मेरे इतिहास को चपटा। फिर मैंने

shopt -s lithist 

और सभी अच्छी तरह से खोजे। (Lithist विकल्प भरोसा दिलाते हैं कि नई-पंक्तियों अपने आदेश में इतिहास संरक्षित कर रहे हैं।)

खोल प्रोग्रामिंग के लिए, मैं गंभीरता से, ksh93 की सलाह देते हैं कई आम यूनिक्स के रूप में यदि आप एक सुसंगत प्रोग्रामिंग भाषा, अच्छा POSIX अनुरूपता, और अच्छा प्रदर्शन करना चाहता हूँ आदेश बिल्टिन फ़ंक्शंस के रूप में उपलब्ध हो सकते हैं।

यदि आप पोर्टेबिलिटी कम से कम दोनों का उपयोग करना चाहते हैं। और सुनिश्चित करें कि आपके पास एक अच्छा परीक्षण सूट है।

गोले के बीच कई सूक्ष्म अंतर हैं। उदाहरण के लिए पाइप से पढ़ने के लिए विचार करें:

b=42 && echo one two three four | 
    read a b junk && echo $b 

इससे अलग-अलग गोले में अलग-अलग परिणाम मिलेंगे। कॉर्न-शैल पाइपलाइनों को पीछे से आगे चलाता है; पाइपलाइन में अंतिम तत्व वर्तमान प्रक्रिया में चलता है।

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

KSH कि करने के लिए एक कट्टरपंथी दृष्टिकोण लिया - और print आदेश, जो वास्तव में गंभीर सिस्टम प्रोग्रामिंग मैं के लिए, दोनों तरीकों (BSD से -n विकल्प, और SysV से पीछे चल \c विशेष वर्ण) का समर्थन करता है

हालांकि शुरू की एक खोल के अलावा कुछ अन्य की सिफारिश करें, जैसे पायथन, perl। या इसे एक कदम आगे ले जाएं, और कठपुतली जैसे प्लेटफ़ॉर्म का उपयोग करें - जो आपको अच्छी ऑडिटिंग के साथ सिस्टम के पूरे क्लस्टर की स्थिति को देखने और सही करने की अनुमति देता है।

शैल प्रोग्रामिंग अनचाहे पानी, या बदतर में तैराकी की तरह है।

किसी भी भाषा में प्रोग्रामिंग को इसके वाक्यविन्यास, इसके इंटरफेस और व्यवहार के साथ परिचितता की आवश्यकता होती है। शैल प्रोग्रामिंग कोई अलग नहीं है।

+0

"इंटरैक्टिव उपयोग" द्वारा क्या आप मैन्युअल प्रॉम्प्ट-टू-प्रॉम्प्ट कमांड निष्पादन का मतलब है कि ऐसे आदेशों को बंडल करने वाली स्क्रिप्ट चलाने के विपरीत? – amphibient

+2

@foampile हां, यही "इंटरैक्टिव उपयोग" का अर्थ है। – Telemachus

+1

पुन: आपके 'read' अंतर, noninteractive मोड में जो वास्तव में आधुनिक बैश के लिए कॉन्फ़िगर करने योग्य है -' lastpipe' विकल्प देखें। –

108

कॉर्नशेल और बैश के बीच का अंतर न्यूनतम है। दूसरे के पास कुछ फायदे हैं, लेकिन अंतर छोटे हैं:

  • बाश वर्तमान निर्देशिका को प्रदर्शित करने वाले संकेत को सेट करना बहुत आसान है। कॉर्नशेल में ऐसा करने के लिए हैकिश है।
  • कॉर्नशेल में सहयोगी सरणी हैं और बीएएसएच नहीं है। अब, आखिरी बार मैंने एसोसिएटिव सरणी का इस्तेमाल किया था ... मुझे सोचने दो ... कभी नहीं।
  • कॉर्नशेल लूप सिंटैक्स को थोड़ा बेहतर संभालता है। आप आमतौर पर कॉर्नशेल लूप में एक मान सेट कर सकते हैं और इसे लूप के बाद उपलब्ध कर सकते हैं।
  • बैश एक क्लीनर तरीके से पाइप से निकास कोड प्राप्त करने के लिए हैंडल करता है।
  • कॉर्नशेल में print कमांड है जो echo कमांड से बेहतर है।
  • बैश में टैब पूर्णता है। पुराने संस्करणों में
  • कॉर्नशेल में r इतिहास कमांड है जो मुझे पुराने आदेशों को जल्दी से पुन: चालू करने की अनुमति देता है।
  • कोर्नशेल में सिंटैक्स cd old new है जो old को new के साथ आपकी निर्देशिका और सीडी में बदल देता है। यह सुविधाजनक है जब आप /foo/bar/barfoo/one/bar/bar/foo/bar नामक निर्देशिका में हैं और आपको /foo/bar/barfoo/two/bar/bar/foo/bar कोर्नहेल में सीडी करने की आवश्यकता है, तो आप बस cd one two कर सकते हैं और इसके साथ किया जा सकता है। बाश में, आपको cd ../../../../../two/bar/bar/foo/bar करना होगा।

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

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

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

बाश बस पसंद का खोल है, इसलिए यदि आपको कुछ सीखना है, तो साथ ही लोकप्रिय क्या हो सकता है।

+6

पूर्णता के लिए, बैश संस्करण 4 सहयोगी सरणी का समर्थन करता है।मैंने कभी भी शैल में एए का उपयोग नहीं किया है, इसलिए मैं यह नहीं कह सकता कि वे बेहतर काम करते हैं, साथ ही साथ, या कॉर्नशेल के कार्यान्वयन से भी बदतर हैं। – chepner

+1

"आप आमतौर पर कॉर्नशेल लूप में एक मान निर्धारित कर सकते हैं और इसे लूप के बाद उपलब्ध कर सकते हैं।" - मुझे लगता है कि नरक के रूप में भ्रमित है। मैं निश्चित रूप से समर्थन करता हूं कि एक चर के पास केवल घोंसले के स्तर के भीतर दायरा होना चाहिए और इसके बाहर नहीं। – amphibient

+1

इसे 'पढ़ते समय' के लिए एक कमांड पाइप करने के साथ करना है। कॉर्नशेल को लूप के बाहर चर का उपयोग करने में कोई समस्या नहीं है। हालांकि, बीएएसएच के लिए, वह पाइप एक बाल प्रक्रिया है, और लूप होने के बाद आप मूल्य खो देते हैं। इसके चारों ओर जाने के तरीके हैं। –

3

अधिकांश यूनिक्स सिस्टम में उपलब्ध, केश मानक-कॉम्प्लांट, स्पष्ट रूप से डिज़ाइन किया गया, अच्छी तरह से गोल किया गया है। मुझे लगता है कि किताबें, ksh में मदद करता है पर्याप्त और स्पष्ट है, खासकर O'Reilly पुस्तक। बैश एक द्रव्यमान है। मैं इसे केवल घर पर लिनक्स के लिए रूट लॉगिन खोल के रूप में रखता हूं।

इंटरैक्टिव उपयोग के लिए, मैं लिनक्स/यूनिक्स पर zsh पसंद करता हूं। मैं zsh में स्क्रिप्ट चलाता हूं, लेकिन मैं अपनी अधिकांश स्क्रिप्ट का परीक्षण करूंगा, हालांकि AIX ksh में फ़ंक्शंस।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^