क्या बैश स्क्रिप्ट के बजाय zsh का उपयोग करने की सिफारिश की गई है? [बन्द है]


25

क्या मैं यह मान सकता हूं कि पर्याप्त लोगों ने zshस्क्रिप्ट को चलाने के लिए स्थापित किया है

#!/usr/bin/env zsh

शेबंग के रूप में

या क्या यह मेरी स्क्रिप्ट को बहुत सारे सिस्टम पर अन-रन करने योग्य बना देगा?

स्पष्टता: मुझे ऐसे कार्यक्रमों / लिपियों में दिलचस्पी है, जिन्हें कोई अंतिम उपयोगकर्ता चलाना चाहता है (जैसे उबंटू, डेबियन, SUSE, आर्क / सी।)


4
अजीब प्रश्न। आपका निशाना कौन है? कुछ हलकों में (रूबी-ऑन-रेल वेब डेवलपर्स) zshलोकप्रिय हो सकते हैं जबकि अन्य (बैंकिंग क्षेत्र) यह लगभग अनसुना है। मुझे लगता है कि अगर आपको इस पर उचित सलाह की आवश्यकता है तो आपको बहुत अधिक जानकारी देनी चाहिए।
रहमू

सामान्य लिनक्स अंत उपयोगकर्ता दुनिया।
प्रोफैट्स

2
WRT "सामान्य लिनक्स अंत उपयोगकर्ता दुनिया", zsh गैर-मानक है। यह डिफ़ॉल्ट रूप से (अधिकांश या सभी डिस्ट्रो पर) या किसी भी चीज के लिए आवश्यक नहीं है, इसलिए अधिकांश लोगों के पास यह स्थापित नहीं होगा।
गोल्डीलॉक्स

3
मैंने अपने किसी भी सिस्टम zshपर स्थापित नहीं किया है , और मैं इसे एक स्क्रिप्ट के लिए स्थापित नहीं करूंगा। आपको बैश से भी बचना चाहिए भले ही बैश आमतौर पर उपलब्ध हो।
फ्रॉस्ट्सचुट्ज़

जवाबों:


29

पोर्टेबिलिटी के लिए, नहीं। जबकि zshकिसी भी यूनिक्स या यूनिक्स-जैसे और यहां तक ​​कि विंडोज को कम से कम साइगविन के माध्यम से संकलित किया जा सकता है, और अधिकांश ओपन सोर्स यूनिक्स-पसंद और कई वाणिज्यिक लोगों के लिए पैक किया गया है, यह आमतौर पर डिफ़ॉल्ट इंस्टॉल में शामिल नहीं है।

bashदूसरे छोर पर जीएनयू सिस्टम (जैसा bashकि जीएनयू प्रोजेक्ट का शेल है) स्थापित किया गया है, जैसे कि गैर-एम्बेडेड लिनक्स आधारित सिस्टम और कभी-कभी ऐप्पल ओएस / एक्स जैसे गैर-जीएनयू सिस्टम पर। वाणिज्यिक यूनिक्स पक्ष में, कॉर्न खोल (एटी एंड टी संस्करण है, हालांकि अधिक ksh88एक) आदर्श है और दोनों bashऔर zshवैकल्पिक संकुल में हैं। BSDs पर, वरीय इंटरैक्टिव खोल अक्सर है tcshजबकि shया तो Almquist खोल या पर आधारित है pdkshऔर bashया zshजरूरत के रूप में अच्छी तरह से वैकल्पिक संकुल के रूप में स्थापित किया जाना है।

zshApple OS / X पर डिफ़ॉल्ट रूप से स्थापित है। यह /bin/shवहां भी हुआ करता था। यह डिफ़ॉल्ट रूप से SysRescCD, Grml, Gobolinux और कुछ अन्य जैसे लिनक्स वितरण में पाया जा सकता है, लेकिन मुझे लगता है कि कोई भी प्रमुख नहीं है।

जैसे bash, वहाँ स्थापित संस्करण का सवाल है और परिणामस्वरूप उपलब्ध सुविधाओं के रूप में। उदाहरण के लिए, सिस्टम को ढूंढना असामान्य नहीं है bash3या zsh3। इसके अलावा, इस बात की कोई गारंटी नहीं है कि जो स्क्रिप्ट आप अभी लिखते हैं, zsh5उसके साथ काम करेंगे zsh6, जैसे कि bashवे पिछड़े संगतता को बनाए रखने की कोशिश करते हैं।

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

फिर, आपके विकल्प हैं:

  • पर्ल जो सर्वव्यापी है (हालांकि फिर से आपको अपने आप को पुराने संस्करणों के फीचर सेट तक सीमित करना पड़ सकता है, और डिफ़ॉल्ट रूप से स्थापित पर्ल मॉड्यूल पर धारणाएं नहीं बना सकता है)
  • दुभाषिया और उसके संस्करण (अजगर 2.6 या उससे ऊपर, zsh 4 या इसके बाद के संस्करण, 4.2 या उससे ऊपर के बैश को निर्दिष्ट करें), अपनी स्क्रिप्ट के लिए एक निर्भरता के रूप में, या तो हर लक्षित प्रणाली के लिए एक पैकेज का निर्माण करके जो निर्भरता को निर्दिष्ट करता है या इसे निर्धारित करता है। README फ़ाइल को आपकी स्क्रिप्ट के साथ भेज दिया गया है या आपकी स्क्रिप्ट के शीर्ष पर टिप्पणियों के रूप में एम्बेड किया गया है, या अपनी स्क्रिप्ट की शुरुआत में बॉर्न सिंटैक्स में कुछ पंक्तियों को जोड़कर जो अनुरोधित दुभाषिया की उपलब्धता की जांच करता है और एक स्पष्ट त्रुटि के साथ बाहर निकलता है जब यह नहीं है, जैसे इस स्क्रिप्ट को zsh 4.0 या इसके बाद के संस्करण की आवश्यकता है
  • अपनी स्क्रिप्ट के साथ दुभाषिया शिप करें (लाइसेंस निहितार्थ से सावधान रहें) जिसका अर्थ है कि आपको हर लक्षित ओएस के लिए एक पैकेज की भी आवश्यकता है। कुछ दुभाषियों ने एक निष्पादन योग्य में स्क्रिप्ट और उसके दुभाषिया को पैक करने का एक तरीका प्रदान करके इसे आसान बना दिया।
  • इसे संकलित भाषा में लिखें। फिर से, एक पैकेज प्रति लक्षित प्रणाली।

"zsh-man" कह "नहीं", मुझे तुम पर गर्व है! ^ ^ पोर्टेबिलिटी ftw! (इसके सभी केवेट्स के साथ ...)। +1।
ओलिवियर दुलक

9

नहीं आप नहीं कर सकते। जो उपलब्ध है उसकी गारंटी दी गई है /bin/sh, मूल रूप से मूल बॉर्न शेल है। लगभग सभी (ध्यान दें "लगभग"!) लिनक्स इंस्टॉलेशन में बैश होगा, लेकिन * बीएसडी सिस्टम पर यह दुर्लभ है (बीएसडी दृढ़ता में जीपीएल कोड के बारे में गंभीर गलतियां हैं, जैसे बैश)। मुझे नहीं पता कि मैक पर मानक शेल क्या है, लेकिन फिर से, जीपीएल के बारे में गलतियां हैं। सोलारिस के लिए भी।

zsh एक आला खोल है, यह फेडोरा की डिफ़ॉल्ट स्थापना में नहीं है (और मुझे विश्वास नहीं है कि यह किसी भी प्रमुख वितरण के लिए डिफ़ॉल्ट है)।


6
निश्चित रूप से मूल बॉर्न शेल नहीं है, बल्कि पॉज़िक्स कंप्लेंट सिस्टम पर एक पॉज़िक्स शेल है, जो कई प्रणालियों पर / बिन / श है, लेकिन जरूरी नहीं कि (सोलारिस <= संस्करण 10 पर यह / usr / xpg4 / bin / sh) है
स्क्रूटिनीज़र

ठीक है, "डिफ़ॉल्ट" स्थापित वास्तव में कोई फर्क नहीं पड़ता। क्या मायने रखता है अगर यह बिल्कुल स्थापित है।
प्रोफैट्स

@Profpatsch, तब डिफ़ॉल्ट इंस्टॉल बहुत प्रासंगिक है (संभवतः वितरण निर्धारित करता है कि लोग वास्तव में क्या उपयोग करते हैं)।
वॉनब्रांड

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

1
ध्यान दें कि यदि आप मानते हैं कि आजकल लिनक्स परिनियोजन का सबसे बड़ा हिस्सा एम्बेडेड है (एंड्रॉइड, प्रिंटर, राउटर, टीवी, लाइटबल्ब्स ...) पर विचार करें, तो लिनक्स आधारित सिस्टम के महान बहुमत नहीं हैं bash(हालांकि उन सिस्टम मुख्य नहीं हैं ओपी ने अपने प्रश्न के लिए मन में लक्ष्य रखा)
स्टीफन चेज़लस

2

मुझे लगता है कि यह वास्तव में क्या पर निर्भर करता है zsh अतिरिक्त सुविधाओं का उपयोग कर रहे हैं और जहां। यदि आप अलग-अलग उपयोगकर्ताओं और प्रणालियों में अपनी स्क्रिप्ट वितरित करने की योजना बना रहे हैं, तो मैं बैश या का उपयोग करने का सुझाव दूंगा

उसी समय यदि आपकी स्क्रिप्ट को आपके संगठन में निष्पादित करने के लिए डिज़ाइन किया गया है और आपकी मशीनों पर zsh करने के लिए कन्वेंशन है (उदाहरण के लिए समान बेसिक AMI) और आपके कार्य में उन्नत फ़ाइल चयनकर्ताओं या http से अन्य सामान जैसे एक्सटेंशन से स्पष्ट लाभ हैं : / /www.rayninfo.co.uk/tips/zshtips.html मैं कहूँगा कि आगे बढ़ो!


1

जैसा कि कहा गया है, bashआम तौर पर कई डिस्ट्रो के लिए डिफ़ॉल्ट स्थापना में उपलब्ध है। आपकी स्क्रिप्ट सबसे बड़ी उपयोगकर्ता आधार पर निर्भर होकर नहीं पहुंचेगी zsh

आपकी स्क्रिप्ट को डिजाइन करने से पहले जवाब देने के लिए एक महत्वपूर्ण सवाल यह है कि " यह क्यों मायने रखता है कि किस स्क्रिप्ट को निष्पादित किया जाता है? "

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

उदाहरण के लिए, bashशेल कुछ ऐसे विस्तार का समर्थन करता है dashजो बॉर्न शेल, या /bin/shउपयोगकर्ता के सिस्टम पर जो भी बिंदुओं द्वारा समर्थित नहीं हैं ।

$ ls -l /bin/sh 
lrwxrwxrwx 1 root root 4 Feb 19  2014 /bin/sh -> dash

के echo {1..10}साथ /bin/shतुलना करने की कोशिश करो /bin/bashऔर आप बहुत अलग उत्पादन मिलेगा।

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

आप अपने संभावित उपयोगकर्ता आधार bashको स्क्रिप्ट के पालन से परे व्यापक कर सकते हैं जो काम के साथ बुलाया जाता है #!/bin/sh -u। हालांकि, यह पूछने के लिए एक और महत्वपूर्ण प्रश्न को जन्म देता है: " अधिक पोर्टेबिलिटी के बदले में क्या बलिदान किया जा रहा है? "

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

कमांडbash लिपि की तुलना करते समय इन लिपियों के समर्थन के लिए इन लिपियों के लिए कई लिपियाँ लिखी जाती हैं । कई और लोग आपकी स्क्रिप्ट को चलाने में सक्षम होंगे, अगर यह zshशेल पर्यावरण के लिए विशेष या किसी अन्य वाक्यविन्यास पर निर्भर करता है।

इसके अलावा, इस बात का भी ध्यान रखें कि आपका अंततः नियंत्रण नहीं है कि उपयोगकर्ता स्क्रिप्ट को कैसे निष्पादित करता है ( विभिन्न गोले में स्क्रिप्ट डीबग करने के लिए भी उपयोगी है ):

याद रखें कि यदि आप किसी शेल स्क्रिप्ट ("sh scriptname") को पढ़ने के लिए इसे सीधे निष्पादित करने के बजाय "(./scriptname") का उपयोग करते हैं, तो शेल शेल स्क्रिप्ट की शुरुआत में सभी टिप्पणियों को टिप्पणियों के रूप में मानेगा। विशेष रूप से, स्क्रिप्ट को निष्पादित करने के लिए दुभाषिया का उपयोग करने वाली टिप्पणी ("#! / Bin / sh -u") को नजरअंदाज कर दिया जाएगा, जैसा कि उस दुभाषिया के पास सूचीबद्ध सभी विकल्पों में से होगा।

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

आप बैश कोडिंग कन्वेंशन - स्टैक ओवरफ्लो भी देख सकते हैं ।


1
"क्या बलिदान किया जा रहा है" ... ऑटोकॉन्फ़ को देखें। उन्होंने "ओरिजिनल बॉर्न शेल" के रूप में लक्षित / बिन / श किया क्योंकि सभी गोले सुविधाओं के उस (छोटे) सेट का समर्थन करते हैं। और उन्होंने इसके लिए बहुत कष्ट सहे।
जुरगेन ए। इरहार्ड

1

केवल एक चीज जिसे आप लगभग गारंटी दे सकते हैं कि एक है /bin/sh। यह वास्तव में स्थिर लिंक्ड शेल हो सकता है, या यह किसी अन्य शेल का लिंक हो सकता है। वह अन्य शेल आमतौर पर पता लगाता है कि इसे श कहा जाता है और संगतता मोड में चलेगा।

पहले वाक्य में लगभग ध्यान दें ।

हर प्रणाली जैसे मैंने कभी काम किया था। उनमें से कई में बैश इंस्टॉल भी था (लेकिन उनमें से सभी नहीं । ईजी बैश यह कुछ बीएसडी पर डिफ़ॉल्ट रूप से स्थापित नहीं है। कुछ लिनक्स वितरण जहाज DASH के साथ , डेबियन अल्मक्विस्ट शेल के बजाय।

आप जो गारंटी दे सकते हैं वह आपके इंस्टॉलेशन निर्देश हैं। आप README फ़ाइल में एक पंक्ति जोड़ सकते हैं जिसमें कहा गया है कि zsh की आवश्यकता है। यदि आप एक पैकेज का निर्माण करते हैं तो आप एक निर्भरता के रूप में zsh को चिह्नित कर सकते हैं। आप इसके लिए ऑटोकॉन्फ़ / ऑटोमेक टूल से जांच कर सकते हैं। आप जाँच कर सकते हैं कि क्या zsh इंस्टॉलेशन स्क्रिप्ट में पाया गया है (शुरुआत / बिन / श से शुरू करें और अगर पता चलता है तो zsh का पता लगाने की कोशिश करें। यदि कोई त्रुटि प्रदर्शित न हो। उदाहरण के लिए "चेतावनी: ZSH इंस्टॉल नहीं है। कृपया इंस्टॉलेशन इंस्ट्रक्शन फाइल पढ़ें! "।)

मुझे यकीन है कि मैं कुछ और विकल्प भूल गया हूं। लेकिन मुख्य बिंदु हैं:

  • जब तक आप इसके लिए जाँच नहीं करते तब तक आप कुछ भी गारंटी नहीं दे सकते।
  • आप लगभग गारंटी देते हैं कि / बिन / श मौजूद है, और आप उस के साथ कुछ जाँच कर सकते हैं।

POSIX की आवश्यकता होती है / बिन / श, AFAIU। जैसे इसे कुछ अन्य उचित उपयोगिताओं की आवश्यकता होती है। जीएनयू ऑटोकैफिकेशन को अपेक्षित जांचें।
वॉनब्रांड

@vonbrand। POSIX की आवश्यकता नहीं है /bin/sh। इसे shसही वातावरण में (जिसकी डिफ़ॉल्ट वातावरण नहीं है) की आवश्यकता है जो इसे निर्दिष्ट करता है। /bin/shPOSIX शेल नहीं हो सकता। उदाहरण के लिए, सोलारिस 10 और इससे पहले, यह अभी भी एक बॉर्न शेल था और मानक अंदर shथा /usr/xpg4/bin
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.