Zsh এ, ফাংশন অনুসন্ধানের পথ (p fpath) ডিরেক্টরিগুলির একটি সেট সংজ্ঞায়িত করে, যার মধ্যে এমন ফাইল রয়েছে যা এতে থাকা ফাংশনটি প্রথমবারের জন্য প্রয়োজন হলে স্বয়ংক্রিয়ভাবে লোড হওয়ার জন্য চিহ্নিত করা যেতে পারে।
জেডএসের অটোলয়েডিং ফাইলগুলির দুটি মোড রয়েছে: জেডএসের নেটিভ উপায় এবং অন্য মোড যা ksh এর অটোলয়েডিংয়ের অনুরূপ। যদি KSH_AUTOLOAD বিকল্পটি সেট করা থাকে তবে পরবর্তীটি সক্রিয় থাকে। জেডএসের নেটিভ মোডটি ডিফল্ট এবং আমি এখানে অন্যভাবে আলোচনা করব না (ksh- স্টাইলের অটোলয়েডিং সম্পর্কে বিশদ জন্য "ম্যান zshmisc" এবং "ম্যান zshoptions" দেখুন)।
ঠিক আছে. বলুন যে আপনি একটি ডিরেক্টরি `~ / .zfunc 'পেয়েছেন এবং আপনি এটি ফাংশন অনুসন্ধানের পথের অংশ হতে চান, আপনি এটি করুন:
fpath=( ~/.zfunc "${fpath[@]}" )
এটি অনুসন্ধানের পথের সামনের অংশে আপনার ব্যক্তিগত ডিরেক্টরি যুক্ত করে । এটি গুরুত্বপূর্ণ যদি আপনি নিজের সাথে zsh এর ইনস্টলেশন থেকে ফাংশনগুলিকে ওভাররাইড করতে চান (যেমন আপনি যখন শেলের একটি পুরানো ইনস্টলড সংস্করণ সহ zsh এর সিভিএস সংগ্রহস্থল থেকে `_git) এর মতো একটি আপডেট সমাপ্তির ফাংশন ব্যবহার করতে চান)।
এটাও লক্ষণীয় যে, p p fpath 'থেকে ডিরেক্টরিগুলি পুনরাবৃত্তভাবে অনুসন্ধান করা হয় না। আপনি যদি নিজের ব্যক্তিগত ডিরেক্টরিটি পুনরাবৃত্তভাবে অনুসন্ধান করতে চান তবে আপনাকে নিজের যত্ন নিতে হবে, এটির মতো (নীচের স্নিপেটটির জন্য T EXTENDED_GLOB 'বিকল্পটি সেট করা দরকার):
fpath=(
~/.zfuncs
~/.zfuncs/**/*~*/(CVS)#(/N)
"${fpath[@]}"
)
এটি প্রশিক্ষণহীন চোখের কাছে ক্রিপ্টিক দেখতে পারে তবে "সিভিএস" নামক ডিরেক্টরিগুলি উপেক্ষা করার সময় এটি সত্যই `~ / .zfunc 'এর নীচে সমস্ত ডিরেক্টরি যুক্ত করে (যা দরকারী, যদি আপনি পুরো চেকআউট করার পরিকল্পনা করছেন zsh এর সিভিএস থেকে আপনার ব্যক্তিগত অনুসন্ধানের পথে ফাংশন ট্রি)।
আসুন ধরে নেওয়া যাক আপনি একটি ফাইল পেয়েছেন ~ ~ / .zfunc / হ্যালো 'যাতে নিম্নলিখিত লাইনটি রয়েছে:
printf 'Hello world.\n'
আপনাকে এখন যা করতে হবে তা হ'ল ফাংশনটিকে তার প্রথম রেফারেন্সের মধ্যে স্বয়ংক্রিয়ভাবে লোড করার জন্য চিহ্নিত করা :
autoload -Uz hello
"আপনি কি জিজ্ঞাসা করেন?" ঠিক আছে, এটি কেবলমাত্র বিকল্পগুলির একটি সেট যা 'অটোল্যাড' দ্বারা সঠিক কাজটি করবে, অন্যথায় কী অপশন সেট করা হচ্ছে না কেন। ফাংশনটি লোড হওয়ার সময় `ইউ 'উপন্যাসের প্রসারকে অক্ষম করে এবং` কেএসএইচ_আউটলোড' যে কোনও কারণেই সেট করা থাকলেও sh z 'zsh-style অটোলেডিংয়ের জন্য বাধ্য করে।
এটির যত্ন নেওয়া হওয়ার পরে, আপনি আপনার নতুন 'হ্যালো' ফাংশনটি ব্যবহার করতে পারেন:
zsh% হ্যালো
ওহে বিশ্ব.
এই ফাইলগুলিকে সোর্স করার বিষয়ে একটি শব্দ: এটি ঠিক ভুল । আপনি যদি সেই source ~ / .zfunc / হ্যালো 'ফাইলটি উত্স করেন তবে এটি কেবল "হ্যালো ওয়ার্ল্ড" মুদ্রণ করবে। একদা. বেশি কিছু না. কোন ফাংশন সংজ্ঞায়িত করা হবে না। এবং তদ্ব্যতীত, ধারণাটি কেবল তখন প্রয়োজন হয় যখন ফাংশনের কোডটি লোড করা হয় । 'অটোল্যাড' কল করার পরে ফাংশনের সংজ্ঞাটি পড়ে না । প্রয়োজন অনুযায়ী ফাংশনটি কেবল অটোলয়েড হিসাবে চিহ্নিত হয়েছে।
এবং পরিশেষে, $ FPATH এবং $ fpath সম্পর্কে একটি নোট: জেডএস সেগুলি সংযুক্ত পরামিতি হিসাবে ধরে রাখে। লোয়ার কেস প্যারামিটারটি একটি অ্যারে। উপরের কেস সংস্করণটি একটি স্ট্রিং স্কেলার, এতে লিঙ্কযুক্ত অ্যারে থেকে এন্ট্রিগুলির মধ্যে প্রবেশ করে কোলন যোগ হয়। এটি সম্পন্ন হয়েছে, কারণ স্কেলারগুলির একটি তালিকা পরিচালনা করা অ্যারেগুলি ব্যবহার করা আরও প্রাকৃতিক, এছাড়াও স্কেলার পরামিতি ব্যবহার করে এমন কোডের পিছনে সামঞ্জস্যতা বজায় রাখাও। আপনি যদি $ FPATH (স্কেলারটি) ব্যবহার করতে চান তবে আপনার সাবধান হওয়া দরকার:
FPATH=~/.zfunc:$FPATH
কাজ করবে, যখন নিম্নলিখিতগুলি কাজ করবে না:
FPATH="~/.zfunc:$FPATH"
কারণটি হ'ল ডাবল উদ্ধৃতিতে টিলডে সম্প্রসারণ করা হয় না। এটি সম্ভবত আপনার সমস্যার উত্স। যদি echo $FPATH
একটি টিলড প্রিন্ট করে এবং প্রসারিত পথ না হয় তবে এটি কার্যকর হবে না। নিরাপদ থাকতে, আমি এই জাতীয় টিলার পরিবর্তে $ হোম ব্যবহার করব:
FPATH="$HOME/.zfunc:$FPATH"
বলা হচ্ছে, আমি এই ব্যাখ্যার শীর্ষে যেমনটি করেছি ঠিক তেমন অ্যারে প্যারামিটার ব্যবহার করব।
আপনার $ FPATH প্যারামিটারও রফতানি করা উচিত নয়। এটি কেবল বর্তমান শেল প্রক্রিয়া দ্বারা প্রয়োজনীয়, এটির কোনও শিশু দ্বারা নয়।
হালনাগাদ
P p fpath 'এ ফাইলগুলির বিষয়বস্তু সম্পর্কে:
Zsh- স্টাইল অটোলয়েডিং সহ, কোনও ফাইলের বিষয়বস্তু হ'ল এটি নির্ধারিত ফাংশনের মূল উপাদান। সুতরাং একটি লাইনযুক্ত "হ্যালো" নামের একটি ফাইল echo "Hello world."
সম্পূর্ণ "হ্যালো" নামক একটি ফাংশন সংজ্ঞায়িত করে। আপনি
hello () { ... }
কোডটি চারপাশে নির্বিঘ্ন করতে পারেন তবে তা অতিমাত্রায় হবে।
যদিও দাবি করা যায় যে একটি ফাইলের মধ্যে কেবল একটি ফাংশন থাকতে পারে তবে তা সম্পূর্ণ সঠিক নয়।
বিশেষত যদি আপনি ফাংশন ভিত্তিক সমাপ্তি সিস্টেম (কমপিস) থেকে কিছু ফাংশনটি দেখে থাকেন তবে আপনি দ্রুত বুঝতে পারবেন যে এটি একটি ভুল ধারণা। আপনি একটি ফাংশন ফাইলে অতিরিক্ত ফাংশন সংজ্ঞায়িত করতে মুক্ত। আপনি যে কোনও প্রারম্ভিককরণের জন্য নির্দ্বিধায় রয়েছেন, যা আপনাকে প্রথমবার ফাংশনটি বলা হওয়ার দরকার হতে পারে। তবে, আপনি যখন করবেন তখন আপনি সর্বদা একটি ফাংশন সংজ্ঞায়িত করবেন যা ফাইলের মতো ফাইলের মতো নামকরণ করা হবে এবং ফাইলটির শেষে সেই ফাংশনটি কল করবে , সুতরাং এটি প্রথমবার সঞ্চালিত হয় যখন ফাংশনটি রেফারেন্স করা হয়।
যদি - উপ-ফাংশন সহ - আপনি ফাইলটির মধ্যে ফাইলের মতো কোনও ফাংশন সংজ্ঞায়িত করেননি, তবে আপনি এতে ফাংশন সংজ্ঞাযুক্ত ফাংশনটি সমাপ্ত করবেন (অর্থাত্ ফাইলের উপ-ফাংশনগুলির সাথে)। আপনি যখন ফাইলটির মতো নামকরণ করা ফাংশনটি কল করবেন তখন আপনি কার্যকরভাবে আপনার সমস্ত উপ-ফাংশন সংজ্ঞায়িত করবেন। সাধারণত, আপনি যা চান তা তাই নয় , সুতরাং আপনি কোনও ফাংশনটিকে নতুন করে সংজ্ঞায়িত করতে চাইবেন, এটি ফাইলের মধ্যে ফাইলের মতো নামকরণ করা হবে।
আমি একটি সংক্ষিপ্ত কঙ্কাল অন্তর্ভুক্ত করব, এটি আপনাকে কীভাবে কাজ করে তার একটি ধারণা দেবে:
# Let's again assume that these are the contents of a file called "hello".
# You may run arbitrary code in here, that will run the first time the
# function is referenced. Commonly, that is initialisation code. For example
# the `_tmux' completion function does exactly that.
echo initialising...
# You may also define additional functions in here. Note, that these
# functions are visible in global scope, so it is paramount to take
# care when you're naming these so you do not shadow existing commands or
# redefine existing functions.
hello_helper_one () {
printf 'Hello'
}
hello_helper_two () {
printf 'world.'
}
# Now you should redefine the "hello" function (which currently contains
# all the code from the file) to something that covers its actual
# functionality. After that, the two helper functions along with the core
# function will be defined and visible in global scope.
hello () {
printf '%s %s\n' "$(hello_helper_one)" "$(hello_helper_two)"
}
# Finally run the redefined function with the same arguments as the current
# run. If this is left out, the functionality implemented by the newly
# defined "hello" function is not executed upon its first call. So:
hello "$@"
আপনি যদি এই নির্বোধ উদাহরণটি চালনা করেন তবে প্রথম রানটি দেখতে এমন দেখাবে:
zsh% হ্যালো
initialising ...
ওহে বিশ্ব.
এবং পরপর কলগুলি এর মতো দেখতে পাবেন:
zsh% হ্যালো
ওহে বিশ্ব.
আমি আশা করি এটি পরিষ্কার হয়ে যায়।
(এই জটিল কৌশলগুলি ব্যবহার করে এমন আরও জটিল বাস্তব-বিশ্বের উদাহরণগুলির মধ্যে একটি zsh এর ফাংশন ভিত্তিক সমাপ্তি সিস্টেমের ইতিমধ্যে উল্লিখিত ` _tmux 'ফাংশন।)