फ़ंक्शंस वाले पर्यावरण चर एक बैश हैक हैं। Zsh में कुछ भी समान नहीं है। आप कोड की कुछ पंक्तियों के साथ भी कुछ ऐसा ही कर सकते हैं। पर्यावरण चर में तार होते हैं; शेलशॉक की खोज से पहले बैश के पुराने संस्करणों को फ़ंक्शन के कोड को एक चर में संग्रहीत किया गया था जिसका नाम फ़ंक्शन का है और जिसका मान () {
फ़ंक्शन के कोड के बाद है }
। आप इस एन्कोडिंग के साथ चर आयात करने के लिए निम्न कोड का उपयोग कर सकते हैं, और उन्हें बैश जैसी सेटिंग्स के साथ चलाने का प्रयास कर सकते हैं। ध्यान दें कि zsh सभी bash फीचर्स का अनुकरण नहीं कर सकता है, आप जो कुछ भी कर सकते हैं वह थोड़ा करीब हो जाता है (जैसे $foo
मान को विभाजित करने और वाइल्डकार्ड का विस्तार करने के लिए, और सरणियों को 0-आधारित बनाना)।
bash_function_preamble='
emulate -LR ksh
'
for name in ${(k)parameters}; do
[[ "-$parameters[name]-" = *-export-* ]] || continue
[[ ${(P)name} = '() {'*'}' ]] || continue
((! $+builtins[$name])) || continue
functions[$name]=$bash_function_preamble${${${(P)name}#"() {"}%"}"}
done
( शेल्शॉक के मूल खोजकर्ता स्टीफन चेज़लस के अनुसार , इस उत्तर का एक पुराना संस्करण इस बिंदु पर मनमाने ढंग से कोड निष्पादित कर सकता है, यदि फ़ंक्शन परिभाषा विकृत थी। यह संस्करण नहीं है, लेकिन निश्चित रूप से जैसे ही आप किसी भी आदेश का पालन करते हैं,)। यह पर्यावरण से आयात किया गया कार्य हो सकता है।)
अमान्य चर नामों (जैसे BASH_FUNC_myfunc%%
) का उपयोग करके वातावरण में बैश के पोस्ट-शेलशॉक संस्करण कार्य करते हैं । यह उन्हें मज़बूती से पार्स करने के लिए कठिन बनाता है क्योंकि zsh पर्यावरण से ऐसे परिवर्तनशील नामों को निकालने के लिए इंटरफ़ेस प्रदान नहीं करता है।
मैं ऐसा करने की सलाह नहीं देता। लिपियों में निर्यात किए गए कार्यों पर भरोसा करना एक बुरा विचार है: यह आपकी स्क्रिप्ट में एक अदृश्य निर्भरता बनाता है। यदि आप कभी भी अपनी स्क्रिप्ट को ऐसे वातावरण में चलाते हैं जिसमें आपका कार्य नहीं है (किसी अन्य मशीन पर, क्रॉन जॉब में, आपकी शेल आरंभीकरण फ़ाइलों को बदलने के बाद ...), तो आपकी स्क्रिप्ट अब काम नहीं करेगी। इसके बजाय, अपने सभी फ़ंक्शंस को एक या अधिक अलग-अलग फ़ाइलों (जैसे कुछ ~/lib/shell/foo.sh
) में संग्रहीत करें और उन कार्यों को आयात करके अपनी स्क्रिप्ट शुरू करें जो इसका उपयोग करता है ( . ~/lib/shell/foo.sh
)। इस तरह, यदि आप संशोधित करते हैं foo.sh
, तो आप आसानी से खोज सकते हैं कि कौन सी स्क्रिप्ट इस पर निर्भर हैं। यदि आप एक स्क्रिप्ट की प्रतिलिपि बनाते हैं, तो आप आसानी से यह पता लगा सकते हैं कि इसे कौन सी सहायक फ़ाइलों की आवश्यकता है।
Zsh (और इससे पहले ksh) स्क्रिप्ट में स्वचालित रूप से कार्यों को लोड करने का एक तरीका प्रदान करके इसे और अधिक सुविधाजनक बनाता है जहां उनका उपयोग किया जाता है। बाधा यह है कि आप प्रति फ़ाइल केवल एक फ़ंक्शन डाल सकते हैं। फ़ंक्शन को ऑटोलॉइड के रूप में घोषित करें, और फ़ंक्शन की परिभाषा को फ़ाइल में डालें जिसका नाम फ़ंक्शन का नाम है। इस फ़ाइल को सूचीबद्ध निर्देशिका में रखें $fpath
(जिसे आप FPATH
पर्यावरण चर के माध्यम से कॉन्फ़िगर कर सकते हैं )। अपनी स्क्रिप्ट में, के साथ ऑटोलॉइड फ़ंक्शन घोषित करें autoload -U foo
।
इसके अलावा zsh स्क्रिप्ट को संकलित कर सकता है, ताकि पार्सिंग समय को बचाया जा सके। zcompile
किसी स्क्रिप्ट को संकलित करने के लिए कॉल करें। यह .zwc
एक्सटेंशन के साथ एक फ़ाइल बनाता है । यदि यह फ़ाइल मौजूद है, तो autoload
स्रोत कोड के बजाय संकलित फ़ाइल को लोड करेगा। आप एक निर्देशिका में सभी फ़ंक्शन परिभाषाओं को संकलित (पुनः) करने के लिए zrecompile
फ़ंक्शन का उपयोग कर सकते हैं ।