क्या सभी बैश स्क्रिप्ट `zsh` के साथ संगत हैं?


63

मैं बैश से zsh में स्विच करना चाह रहा हूं लेकिन बैश स्क्रिप्ट की अनुकूलता के बारे में चिंतित हूं।

क्या सभी बैश स्क्रिप्ट / फ़ंक्शन zsh के साथ संगत हैं? इसलिए, अगर यह सच है कि क्या ज़ेश सिर्फ झाड़ू बढ़ाने वाला है?


मुझे यह उपयोगी लगा: askubuntu.com/questions/1577/moving-from-bash-to-zsh
chrisjlee

जवाबों:


55

यदि आपकी स्क्रिप्ट लाइन से शुरू होती है, तो #!/bin/bashवे अभी भी बैश का उपयोग करके चलाई जाएंगी, भले ही आपका डिफ़ॉल्ट शेल zsh हो।

मुझे पता चला है कि zsh का वाक्य-विन्यास वास्तव में बैश के करीब है, और मैंने ध्यान नहीं दिया अगर वास्तव में कुछ असंगतताएं थीं। मैं 6 साल पहले बैश से zsh में मूल रूप से स्विच किया।


1
स्विचिंग पर आपका सबसे चुनौतीपूर्ण हिस्सा क्या था?
चिरसली

4
कोई नहीं। मेरी व्यक्तिगत स्क्रिप्ट में बैश के लिए उचित संदर्भ जोड़ा गया है और मैंने शुरुआत करने के लिए एक अच्छा .zshrc पाया है। Zsh और bash काफी समान थे जो मुझे वास्तव में चुनौतीपूर्ण नहीं लगे।
ह्यूजेंस

4
क्या आप अपने .zshrc:)
निउमासिक

लेकिन अगर #!/bin/bashस्क्रिप्ट फ़ाइल की तरह चल रही है तो लाइन को अनदेखा किया जाएगा source ./script.sh?
LCB

3
शेल को पथ को हार्ड-कोडिंग करना बुरी सलाह है, भले ही यह अक्सर किया जाए। आपको #!/usr/bin/env bashइसके बजाय विशेष रूप से macOS पर उपयोग करना चाहिए , जहां डिफ़ॉल्ट बैश गंभीर रूप से पुराना है और नए संस्करण लगभग हमेशा एक अलग पथ में स्थापित होते हैं।
कोनराड रुडोल्फ

29

यदि आप इसे सही एमुलेशन मोड ( 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

यदि कोई फ़ंक्शन किसी अन्य फ़ंक्शन को कॉल करता है, तो दूसरा फ़ंक्शन इम्यूलेट सेटिंग को इनहेरिट करता है, इसलिए आपको इस कार्य को आंतरिक कार्यों में डालने की आवश्यकता नहीं है, केवल अंत-उपयोगकर्ता द्वारा कॉल किए गए फ़ंक्शन में।


1
यदि आप अपनी स्क्रिप्ट चलाते हैं, तो आपके द्वारा उपयोग किया जाने वाला शेल अप्रासंगिक है ./my_script.shsource my_script.shऔर . my_script.shइसे चालू शेल के रूप में चलाएंगे, किसी भी शेबंग की अनदेखी करते हुए।
BallpointBen 15

3

यदि शेबंग है #!/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 में बहुत सारे (बहुत सारे) एक्सटेंशन हैं जो इंटरैक्टिव तरीके से काम करना आसान बनाते हैं। एक ही समय में स्विच करने के लिए एक उत्कृष्ट कारण और एक समस्या है:

  1. प्रो zsh

    • टैब को दबाते हुए कमांड सिंटैक्स विकल्पों को देखने में सक्षम होना बहुत अच्छा है।
    • जब आप टाइपो बनाते हैं, तो zsh का एक और प्रमुख लाभ त्रुटि सुधार होता है। केवल प्रदर्शन त्रुटि के बजाय: आदेश नहीं मिला, zsh आपको जो टाइप करने की कोशिश की गई है, उसकी व्याख्या करने की कोशिश करेगा। zsh इस इनपुट को एक मान्य कमांड के रूप में स्वीकार करेगा।
    • इसके अलावा, zsh में विस्तार के लिए कई संशोधक हैं जो समाधान की एक बड़ी श्रृंखला की अनुमति देते हैं। जैसे: केवल फाइलों की सूची: ls *(.)(जो अन्य गोले के साथ मुश्किल है)। यहां तक ​​कि जब बहुत गहराई से देख रहे हैं तो उत्तर भी ज़श ( print -rl -- *(/)) में जटिल हो जाता है
    • गणित को फ्लोट्स (कुछ कैविट्स के साथ) स्वीकार करें।
  2. कोन ज़श:

    • बैश कई और प्रणालियों में डिफ़ॉल्ट शेल है।
    • कई zsh विकल्प सीधे bash संगत स्क्रिप्ट लिखने में मदद नहीं करते हैं।
    • यह भी एक ही समय में दो गोले सीखने की कोशिश कर एक बड़ी समस्या बन सकता है।

अंत में, यह आपकी पसंद है, और, मुझे हमेशा अधिक विकल्प पसंद हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.