Zsh এ একটি ফাংশনের উত্স সনাক্ত করা


6

আমার জিএসএস শেলটিতে আমার এই বিরক্তিকর সমস্যা রয়েছে যেখানে কোনও ফাংশন কোথাও ঘোষিত হচ্ছে এবং সেই ফাংশনটির নাম দেওয়া হয়েছে "সিপি" যাতে এটি স্বাভাবিক সিপি আচরণকে ওভাররাইড করে। আমি ফাংশন ঘোষণাটি সনাক্ত করার চেষ্টা করছি কিন্তু আমি পারছি না। আমি ইতিমধ্যে .zshrc এর সাধারণ জায়গাগুলি এবং .zshrc এ অন্তর্ভুক্ত থাকা বিভিন্ন অন্যান্য উত্সগুলিতে দেখেছি তবে এখনও কিছুই হয়নি।

অন্যান্য জিনিস আমি চেষ্টা করেছি:

  • grep -r 'function cp' . (~ থেকে)
  • whence -f cp (ফাংশন সংজ্ঞা দেয় তবে এটি কোথা থেকে ঘোষণা করা হয়নি)

কোন ধারনা?

উত্তর:


3

প্রথমত, একটি ফাংশনটি functionকীওয়ার্ড ছাড়াই সংজ্ঞায়িত করা যায় যাতে আরও ভাল অনুসন্ধান করা যায়

grep 'cp()' .*

যে উল্লিখিত বিবরণ অনুযায়ী ফাইলগুলির মাধ্যমে অনুসন্ধান করবে .zshrcএবং .profileএবং যে কোন বস্তু। যদি এটি কিছুই না পেয়ে থাকে তবে আপনি লোড হওয়া বিভিন্ন ফাইলও দেখতে চাইতে পারেন zsh। এগুলির একেবারে শেষে তালিকাভুক্ত করা হয়েছে man zsh:

FILES
       $ZDOTDIR/.zshenv
       $ZDOTDIR/.zprofile
       $ZDOTDIR/.zshrc
       $ZDOTDIR/.zlogin
       $ZDOTDIR/.zlogout
       ${TMPPREFIX}*   (default is /tmp/zsh*)
       /etc/zsh/zshenv
       /etc/zsh/zprofile
       /etc/zsh/zshrc
       /etc/zsh/zlogin
       /etc/zsh/zlogout    (installation-specific - /etc is the default)

ডিফল্টরূপে $ZDOTDIRআপনার হওয়া উচিত $HOME। সুতরাং, এই আদেশটি আপনার আপত্তিজনক ফাইলটি সন্ধান করবে:

grep 'cp()\|cp ()' ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin /etc/zsh/zshenv \
 /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin 

আমি যুক্ত করেছি \|যেহেতু আপনিও ফাংশনটির নাম এবং ফাংশনটির মধ্যে ফাঁক রাখতে পারেন। পরিশেষে, @ ডেনিস নির্দেশ করে যে আপনি functionকীওয়ার্ডটি ব্যবহার করলে বন্ধনীগুলিও বাদ দেওয়া যেতে পারে । সুতরাং, আরও সুরক্ষিত হতে, এটি করুন:

grep -E 'function cp|cp *\(\)' ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin \
  /etc/zsh/zshenv /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin 

grepফাইলগুলির সাথে আরম্ভ করে অনুসন্ধান করা হবে না .তাই এটি বেশ বেহুদা। এটা সত্যি না. যখন সঙ্গে ব্যবহার -rসুইচ, , grep নালা যাব সব ডিরেক্টরি এটা encounters মধ্যে ফাইল। (কমপক্ষে গ্রেপ এর আমার সংস্করণটি করে))
ডেনিস

@ ডেনিস আমি সংশোধন করে দাঁড়িয়েছি, আমি গ্লোববিংয়ের কথা ভাবছিলাম যা এখানে সম্পূর্ণ অপ্রাসঙ্গিক। ধন্যবাদ, উত্তর সংশোধন করা হয়েছে।
টেরডন

এছাড়াও, মূল functionশব্দটি ব্যবহার করা থাকলে বন্ধনীগুলি .চ্ছিক । grep -E 'function cp|cp *\(\)'সব ক্ষেত্রে ধরা উচিত।
ডেনিস

@ ডেনিস মেলা যথেষ্ট, আবার ধন্যবাদ, উত্তর সম্পাদিত।
টেরডন

14

আমার আজ এটি করা দরকার এবং whence -vফাংশন সংজ্ঞাযুক্ত ফাইলটি আউটপুট করে দেখতে পেলাম ।

$ whence -v function_name
function_name is a shell function from /path/to/file

আপনি কি আপনার zsh এর সংস্করণটি পোস্ট করতে পারেন? আমি zsh এর সাথে আউটপুটটি দেখতে পাচ্ছি না5.0.2
তারাসচ


2

Zsh এর নতুন সংস্করণগুলি (5.4 সাল থেকে, প্রতিশ্রুতিতে যুক্ত হওয়া 34f70c5) মডিউলটির $functions_sourceঅংশ হিসাবে ডাবলিকে সমর্থন করে zsh/parameter(ডকুমেন্টেশন man zshmodules:):

functions_source

এই পঠনযোগ্য অ্যাসোসিয়েটিভ অ্যারে ফাংশনের উত্স সম্বলিত ফাইলটির নামে সক্ষম ফাংশনের নামগুলি ম্যাপ করে।

ইতিমধ্যে লোড করা হয়েছে এমন একটি স্বতঃসংশোধিত ক্রিয়াকলাপের জন্য, বা একটি অবিশ্বাস্য পথের সাথে অটোল্যাডের জন্য চিহ্নিত করা হয়েছে, বা এর পথটি ' functions -r' দিয়ে সমাধান হয়েছে, এটি অটলয়েডিংয়ের জন্য পাওয়া ফাইল, পরম পথে সমাধান করা to

কোনও স্ক্রিপ্ট বা উত্সযুক্ত ফাইলের মূল অংশের মধ্যে সংজ্ঞায়িত কোনও ফাংশনের জন্য, এই ফাইলটির নাম। এই ক্ষেত্রে, এটি সেই ফাইলটির মূলরূপে ব্যবহৃত সঠিক পথ যা কোনও আপেক্ষিক পথ হতে পারে।

ইন্টারেক্টিভ প্রম্পটে সংজ্ঞায়িত বা অটোল্যাড ফাংশন যার পথ এখনও সমাধান হয়নি এমন অন্য কোনও ফাংশনের জন্য, এটি খালি স্ট্রিং। তবে, ফাংশনটি উপস্থিত থাকাকালীন হ্যাশ উপাদানটি সংজ্ঞায়িত হিসাবে রিপোর্ট করা হয়েছে: এই হ্যাশটির চাবিগুলি যেগুলি রয়েছে তেমন একই $funcions

সুতরাং, আপনি করতে পারেন

echo $functions_source[cp]

0

টার্ডনের উত্তরটি আপনাকে ইতিমধ্যে grepকোনও কার্য সংজ্ঞাটির সমস্ত সম্ভাব্য রূপগুলি ধরার জন্য উপযুক্ত কমান্ড দিয়েছে ।

আমি আরও দুটি পয়েন্ট যোগ করতে চাই।

  1. প্রকৃতপক্ষে পড়া ফাইলগুলির একটি তালিকা পেতে (যেমন একটি অ-মানক ফাইল অন্য ফাইল দ্বারা উত্সাহিত করা যেতে পারে!), আপনি সক্ষম বিকল্পটি zshদিয়ে প্রার্থনা করতে পারেন SOURCE_TRACE:

    $ zsh -o sourcetrace
    +/etc/zshenv:1> <sourcetrace>
    +/home/user/.zshrc:1> <sourcetrace>
    +/home/user/.zcompdump:1> <sourcetrace>
    +/home/user/.zshrc-last:1> <sourcetrace>
    
  2. এর সাথে, গ্রেপ-অ্যাপ্রোচ '' আপনি বিল্টিনের মাধ্যমে স্বয়ংক্রিয়ভাবে ব্যবহৃত ফাংশনগুলি ধরতে পারবেন না autoload। সুতরাং, fpathআপনারও একটি পরীক্ষা করে দেখুন:

    $ for i ($fpath) { ls -l "$i"/cp }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.