मैं बैश से zsh में स्विच करना चाह रहा हूं लेकिन बैश स्क्रिप्ट की अनुकूलता के बारे में चिंतित हूं।
क्या सभी बैश स्क्रिप्ट / फ़ंक्शन zsh के साथ संगत हैं? इसलिए, अगर यह सच है कि क्या ज़ेश सिर्फ झाड़ू बढ़ाने वाला है?
मैं बैश से zsh में स्विच करना चाह रहा हूं लेकिन बैश स्क्रिप्ट की अनुकूलता के बारे में चिंतित हूं।
क्या सभी बैश स्क्रिप्ट / फ़ंक्शन zsh के साथ संगत हैं? इसलिए, अगर यह सच है कि क्या ज़ेश सिर्फ झाड़ू बढ़ाने वाला है?
जवाबों:
यदि आपकी स्क्रिप्ट लाइन से शुरू होती है, तो #!/bin/bash
वे अभी भी बैश का उपयोग करके चलाई जाएंगी, भले ही आपका डिफ़ॉल्ट शेल zsh हो।
मुझे पता चला है कि zsh का वाक्य-विन्यास वास्तव में बैश के करीब है, और मैंने ध्यान नहीं दिया अगर वास्तव में कुछ असंगतताएं थीं। मैं 6 साल पहले बैश से zsh में मूल रूप से स्विच किया।
.zshrc
:)
#!/bin/bash
स्क्रिप्ट फ़ाइल की तरह चल रही है तो लाइन को अनदेखा किया जाएगा source ./script.sh
?
#!/usr/bin/env bash
इसके बजाय विशेष रूप से macOS पर उपयोग करना चाहिए , जहां डिफ़ॉल्ट बैश गंभीर रूप से पुराना है और नए संस्करण लगभग हमेशा एक अलग पथ में स्थापित होते हैं।
यदि आप इसे सही एमुलेशन मोड ( emulate sh
या emulate ksh
) में रखते हैं, तो Zsh अधिकांश बॉर्न, POSIX या ksh88 स्क्रिप्ट चला सकता है । यह बैश या ksh93 की सभी विशेषताओं का समर्थन नहीं करता है। Zsh में बैश की अधिकांश विशेषताएं हैं, लेकिन कई मामलों में एक अलग वाक्यविन्यास के साथ।
आपके द्वारा अंतःक्रियात्मक रूप से उपयोग किया जाने वाला शेल आपके पास किसी भी स्क्रिप्ट के लिए अप्रासंगिक है। गोले जो स्क्रिप्ट चलाता है, वह पहली पंक्ति में इंगित किया गया है, शेबंग लाइन। उदाहरण के लिए, यदि स्क्रिप्ट के साथ शुरू होता है #!/bin/bash
, तो इसे बैश द्वारा निष्पादित किया जाएगा।
आप पार्टी के लिए अनुकूलित है, तो आप सिर्फ अपने नाम बदलने में सक्षम नहीं होगा .bashrc
करने के लिए .zshrc
। कुछ चीजें साझा की जा सकती हैं, उदाहरण के लिए उपनाम और कार्य, जब तक आप दो गोले के बीच चौराहे पर चिपके रहते हैं (चौराहा ksh88 और pdksh के करीब है )। अन्य चीजें, जैसे शीघ्र सेटिंग्स, पूर्ण कार्य और अधिकांश विकल्प, को पूरी तरह से फिर से लिखना होगा।
यदि आप लोगों से उनके स्रोत के लिए एक स्निपेट लिख रहे हैं .bashrc
या .zshrc
आप दो संस्करणों को बनाए रखना नहीं चाहते हैं, तो बैश और zsh सुविधाओं के एक सामान्य सबसेट से चिपके रहें, जिसमें अधिकांश बैश प्रोग्रामिंग सुविधाएँ शामिल हैं। अपने पूरे कोड को फंक्शंस में रखें, और प्रत्येक फ़ंक्शन के शीर्ष पर निम्नलिखित लाइन डालें:
if [ -n "$ZSH_VERSION" ]; then emulate -L ksh; fi
आप सादे श सिंटैक्स के करीब होने के emulate sh
बजाय इसका उपयोग कर सकते हैं emulate ksh
, जो कि आपके लिए आवश्यक है .profile
।
यदि कोई फ़ंक्शन किसी अन्य फ़ंक्शन को कॉल करता है, तो दूसरा फ़ंक्शन इम्यूलेट सेटिंग को इनहेरिट करता है, इसलिए आपको इस कार्य को आंतरिक कार्यों में डालने की आवश्यकता नहीं है, केवल अंत-उपयोगकर्ता द्वारा कॉल किए गए फ़ंक्शन में।
./my_script.sh
। source my_script.sh
और . my_script.sh
इसे चालू शेल के रूप में चलाएंगे, किसी भी शेबंग की अनदेखी करते हुए।
यदि शेबंग है #!/bin/bash
और आप स्क्रिप्ट शुरू करते हैं, तो स्क्रिप्ट को ./script
बैश द्वारा निष्पादित किया जाएगा। यहां कोई समस्या नहीं है।
हालाँकि, यदि आप zsh ./script
इसे . ./script
चल रहे zsh उदाहरण के लिए निष्पादित या स्रोत करते हैं , तो यह काफी सामान्य है कि बैश और zsh का वाक्यविन्यास मेल नहीं खाएगा।
उदाहरण के लिए, zsh डिफ़ॉल्ट रूप से पैरामीटर विस्तार को विभाजित नहीं करता है, बैश में एक हेल्प बिलिन होता है, zsh में कोई नहीं होता है read -p prompt
(वाक्यविन्यास बहुत अलग पढ़ा जाता है cmd \? प्रॉम्प्ट , arrays start on 1 (not 0) in zsh,
कमांड only search for external commands in zsh, or there is no (simple) equivalent to
$ {foo ^} `` (अपरकेस केवल zsh में पहला अक्षर है? दूसरों के बीच। यह (ज्यादातर) समानता और कुछ मतभेदों की एक लंबी सूची है ।
कुछ मामलों में, zsh को अन्य गोले का अनुकरण करने के लिए कहा जा सकता है। कुछ मामलों में, दोनों गोले संभव के लिए कोई आम वाक्यविन्यास पोर्टेबल नहीं है (पोर्टेबल समाधान का अनुकरण करने के लिए उपनाम या फ़ंक्शन का उपयोग किए बिना)।
हालाँकि, zsh में बहुत सारे (बहुत सारे) एक्सटेंशन हैं जो इंटरैक्टिव तरीके से काम करना आसान बनाते हैं। एक ही समय में स्विच करने के लिए एक उत्कृष्ट कारण और एक समस्या है:
ls *(.)
(जो अन्य गोले के साथ मुश्किल है)। यहां तक कि जब बहुत गहराई से देख रहे हैं तो उत्तर भी ज़श ( print -rl -- *(/)
) में जटिल हो जाता है ।कोन ज़श:
अंत में, यह आपकी पसंद है, और, मुझे हमेशा अधिक विकल्प पसंद हैं।