এনভায়রনমেন্ট ভেরিয়েবলগুলি রয়েছে ফাংশনগুলি একটি ব্যাশ হ্যাক hack Zsh এর মতো কিছু নেই। আপনি কয়েকটি লাইনের কোডের সাথে অনুরূপ কিছু করতে পারেন। পরিবেশের ভেরিয়েবলগুলিতে স্ট্রিং থাকে; শ্যাশশকের আবিষ্কারের আগে বাশনের পুরানো সংস্করণগুলি ফাংশনের কোডটি একটি ভেরিয়েবলে সঞ্চিত করে যার নামটি ফাংশনটির এবং যার মান () {অনুসরণ করে ফাংশনের কোড অনুসরণ করে }। আপনি এই এনকোডিং সহ ভেরিয়েবলগুলি আমদানি করতে নীচের কোডটি ব্যবহার করতে পারেন, এবং এগুলিকে ব্যাশের মতো সেটিংস দিয়ে চালানোর চেষ্টা করতে পারেন। নোট করুন যে zsh সমস্ত বাশ বৈশিষ্ট্যগুলি অনুকরণ করতে পারে না, আপনি যা কিছু করতে পারেন তা কিছুটা কাছাকাছি যেতে হবে (উদাহরণস্বরূপ $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
(যেমন শেলশকের মূল আবিষ্কারক স্টাফেন চেজেলাস উল্লেখ করেছেন যে, এই উত্তরের পূর্ববর্তী সংস্করণটি ফাংশন সংজ্ঞাটি ত্রুটিযুক্ত থাকলে এই সময়ে স্বেচ্ছাচারিত কোড কার্যকর করতে পারে This এটি পরিবেশ থেকে আমদানি করা কোনও ফাংশন হতে পারে))
অবৈধ ভেরিয়েবলের নাম ব্যবহার করে পরিবেশে বাশ এনকোড ফাংশনগুলির শেলশক সংস্করণ 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ফাংশনটি ব্যবহার করতে পারেন ।