যেখানে বাশ ফাংশনটি সংজ্ঞায়িত করা হয়েছে সেখানে ফাইলটি কীভাবে সন্ধান করবেন?


33

ব্যাশ ফাংশনটি যেখানে সংজ্ঞায়িত হয়েছে (সেখানে __git_ps1আমার ক্ষেত্রে) ফাইলটি কীভাবে সন্ধান করব তা আমি বুঝতে পারি না ।

আমি পরীক্ষানিরীক্ষা সঙ্গে declare, type, which, কিন্তু কিছুই আমাকে সোর্স ফাইল বলে। আমি কোথাও পড়েছি declareযা ফাইলের নাম এবং লাইন নম্বর মুদ্রণ করতে পারে, তবে কীভাবে তা ব্যাখ্যা করা হয়নি। helpজন্য পৃষ্ঠা declareপারেন এটা বলতে নেই।

আমি কীভাবে এই তথ্য পেতে পারি?


যদি ফাংশনের ফাইলের পথটি অন্তর্ভুক্ত না করা হয় $PATH, তবে typeকাজ করবে না। আপনি কেবল ব্যবহার করতে চেষ্টা করতে পারেন findবা locatelocateএটি আরও দ্রুত হবে, যেহেতু এটি পূর্ব-বিদ্যমান ডাটাবেস ব্যবহার করে তবে কমান্ডটি সম্প্রতি ইনস্টল করা থাকলে এটি কার্যকর হবে না।
ব্যবহারকারী 628544

সম্পর্কিত: unix.stackexchange.com/q/322459/117549
জেফ

উত্তর:


37

আপনি যদি ফাংশনটি চালানোর জন্য প্রস্তুত থাকেন set -xতবে এক্সিকিউশনটি ট্রেস করে ও PS4ভেরিয়েবল সেট করে আপনি তথ্যটি পেতে পারেন ।

  1. অতিরিক্ত ডিবাগিং তথ্য রেকর্ড --debuggerকরতে বাশ দিয়ে বাশ শুরু করুন shopt -s extdebug

  2. PS4উত্স রেখাটি দেখানোর জন্য ট্রেস করার সময় সেট করুন , 'প্রম্পট' মুদ্রিত।

  3. ট্রেসিং চালু করুন।

  4. তারপরে আপনি আপনার ফাংশনটি চালাতে পারবেন এবং প্রতিটি লাইনের জন্য আপনি ফাংশনের ফাইল নাম পাবেন।

  5. set +xট্রেসিং বন্ধ করতে ব্যবহার করুন ।

সুতরাং এই ক্ষেত্রে আপনি চালিত হবে

bash --debugger
PS4='+ ${BASH_SOURCE[0]} '
set -x ; __git_ps1 ; set +x

"-x প্রতিটি সাধারণ কমান্ড প্রসারিত করার পরে, কমান্ড, কেস কমান্ড, কমান্ডের জন্য সিলেক্ট কমান্ড, বা পাটিগণিত, পিএস 4 এর বর্ধিত মান প্রদর্শন করুন, এরপরে কমান্ড এবং এর প্রসারিত আর্গুমেন্ট বা সম্পর্কিত শব্দ তালিকার তালিকা প্রদর্শন করুন।" নিস!
l0b0

25

আপনি যদি ফাংশনটি চালাতে রাজি না হন তবে আপনি ডিবাগিং সেট আপ করতে পারেন এবং তথ্য পেতে পারেন। পদক্ষেপগুলি হল

  1. ফাংশন সংজ্ঞায়িত হওয়ার আগে bash --debuggerবা শুরু করুন shopt -s extdebug
  2. declare -F __git_ps1

এবং এটি ফাংশন সংজ্ঞায়িত হয়েছে যেখানে রিপোর্ট করবে।

পিএস 4 এর সাথে টীকাযুক্ত এক্সিকিউশন ট্রেস দেখার তুলনায় এই পদ্ধতির সুবিধাগুলি

  • অনেক কম আউটপুট
  • এটি সরাসরি প্রশ্নের উত্তর দেয়

মৃত্যুদন্ড কার্যকর করার সুবিধাগুলি হ'ল

  • সমস্ত কল করা ফাংশন একবারে দেখুন
  • বলা ফাংশনগুলির মধ্যে সম্পর্ক দেখুন
  • পুনরাবৃত্তি দেখুন

আমি দৃ strongly ়ভাবে shopt -s extdebugউভয়ের শুরুতে থাকার ~/.bashrcএবং ~/.bash_profileবিভিন্নটি কভার করার পরামর্শ দিচ্ছি ফাইল বিভিন্ন ব্যবহৃত আবাহন মামলা।


1
এছাড়া কাজ করে shopt -s extdebugবলা হয় পরে ফাংশন সংজ্ঞায়িত করা হয়। সাবধানতা অবলম্বন লাইন নম্বর বন্ধ হতে পারে (একটি বর্তমান বাগ) যদি ফাংশনটির মাধ্যমে ঘোষণা করা হয় eval
স্টাফেন চেজেলাস

আমি ভিপিএনসি-র জন্য একটি বিভ্রান্ত সমাপ্তির পরে ছিলাম। bash --debuggerসমাপ্তির ফাংশনটি সংজ্ঞায়িত করতে এবং এখান থেকে রিপোর্ট করার জন্য আমাকে আসলে সম্পূর্ণ ট্রিগার করতে হয়েছিল declare -F _vpnc
হ্যারাল্ড

9

@ আইক্রাসের দুর্দান্ত সমাধান ফাংশনগুলির জন্য কাজ করে, যতক্ষণ না সেগুলি আক্ষরিকভাবে সংজ্ঞায়িত করা হয় এবং evalঅন্য কোনও ফাইলের সামগ্রীর ফলাফল হিসাবে নয় (যেখানে উইলের সাথে থাকা ফাইলটি evalউত্স হিসাবে প্রদর্শিত হবে)। এটি এলিয়াস, শেল বিল্ট-ইনস (লাইক echo) এবং এক্সিকিউটেবল (বাইনারি বা না) এর উত্স ফাইলটি প্রিন্ট করবে না এবং আমি বিশ্বাস করি যে এই তথ্যটি সাধারণভাবে উপলভ্য নয়। কিছু আদেশ কমান্ডগুলি তাদের উত্স ফাইলগুলি মুদ্রণ করতে পারে (এবং এটি সম্পর্কে সত্যবাদীও হতে পারে), সাধারণ সম্পাদনের সময় অথবা সংকেতের প্রতিক্রিয়া হিসাবে।

__git_ps1আমার সিস্টেমে, আর্চ লিনাক্সে /usr/share/git/git-prompt.shএবং এর /usr/share/git/completion/git-prompt.shউপর সংজ্ঞায়িত করা হয়েছে , সুতরাং এটি আপনার ক্ষেত্রেও একই হতে পারে।

কটাক্ষপাত আছে আবাহন বিভাগে man bashআপনি কমান্ড বিশেষভাবে শেল শুরুতে sourced জন্য বর্ণন চান - তারা যেটা ঘুরে সোর্সে অন্যান্য ফাইল উৎস হতে পারে অন্যান্য ফাইল।


কেউ কি ফাইলগুলি শুরু করার পরে উত্সাহিত করে তার তালিকা পেতে পারে bash?
pfnuesel

@pfnuesel - এটি আপনার উপর নির্ভর করে। ডিফল্ট হয় $HOME/.bashrcএবং ভিতরে হয় $HOME/.profile। দেখুন: linuxfromscratch.org/blfs/view/svn/postlfs/profile.html যা প্রতিটি ফাইল কখন এবং কীভাবে উত্পন্ন হয় তার কিছু বিশদ ব্যাখ্যা করে।
জো

2
@ জো gnu.org/software/bash/manual/html_node/Bash- স্টার্টআপ- ফাইলস এইচটিএমএল একটি আরও ভাল রেফারেন্স। /etc/profile, $HOME/.bash_profile, $HOME/.bash_login, এবং বিষয়বস্তু $ENVএবং $BASH_ENVপ্রয়োজন আপনার তালিকায় যোগ করা হবে।
আইক্রাস

@ আইক্রাস - ধন্যবাদ এটি একটি ভাল ব্যাখ্যা।
জো

8

এটি সম্ভব হবে বলে মনে হয় না bashতবে এটি এতে রয়েছে zsh:

$ type __git_ps1
> __git_ps1 is a shell function from /usr/share/git/git-prompt.sh

প্রশ্ন বাশকে নির্দিষ্ট করে ...
জেফ শ্যাচলার

4
@ জেফশ্যাচলার: এই উত্তরটি ব্যবহার করার সুস্পষ্ট উপায় হ'ল বাশ যে একই ফাইলগুলি উত্সের জন্য zsh সেট আপ করা, তারপরে সংজ্ঞাটি সন্ধান করতে এটি ব্যবহার করুন। এই উত্তরটি zsh এ স্যুইচ করার পরামর্শ দিচ্ছে না, এটি সম্ভবত একটি কার্যকর সরঞ্জাম যা শেল সিনট্যাক্সকে find/ locate/ এর মতো জেনেরিক সরঞ্জামগুলির চেয়ে ভাল বোঝে grep
পিটার কর্ডেস

আমি দাবি করব, @ পিটারকর্ডস, এই উত্তরটি বর্তমানে প্রশ্নের উত্তরটি দেওয়ার জন্য আপনার যা করা উচিত তা করেন না। আমি জানি না যে zsh স্থানীয়ভাবে একই ফাইলগুলি পড়বে যা ব্যাশ করে।
জেফ শ্যাচলার

@ জেফশ্যাচলার: সম্মত হয়েছি এই উত্তরটির উন্নতির প্রয়োজন। zsh প্রায়শই ~/.whateverডিফল্টরূপে ব্যাশের মতো একই ফাইলগুলি পড়ে না এবং কেবলমাত্র এই ক্ষেত্রে ভাগ করা জায়গাগুলিতে সংজ্ঞায়িত ফাংশনগুলির জন্য দরকারী উত্তর দেয় ~/.bashrcযা এগুলিতে পুনরায় সংজ্ঞায়িত বা কিছু নয়।
পিটার কর্ডেস

-1

একই নামের সাথে একটি ফাংশন ঘোষণা করুন এবং এটি যত তাড়াতাড়ি সম্ভব পঠনযোগ্যভাবে সেট করুন, তারপরে xtrace মোডটি সক্রিয় করুন, এরকম কিছু:

__git_ps1(){ :;}
readonly -f __git_ps1
set -x

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

আপনাকে এটি সিস্টেম ব্যাশ প্রোফাইলে রাখতে হবে। এছাড়াও অপরাধীর সন্ধানের পরে পরিবর্তনগুলি ফিরিয়ে আনতে ভুলবেন না।


-3

আপনি কি এই চেষ্টা করেছেন?

grep -rnw '/path/to/somewhere/' -e "pattern" 

বা অন্য যে কোনও আদেশ এখানে পাওয়া যায়:

লিনাক্সে সুনির্দিষ্ট পাঠ্যযুক্ত সমস্ত ফাইল কীভাবে খুঁজে পাব? | স্ট্যাক ওভারফ্লো

মনে হচ্ছে আপনাকে আরও একটি ব্যাখ্যা দেওয়ার দরকার আছে। আপনার প্রশ্ন জিজ্ঞাসা করে "" সুতরাং আপনি যদি নিম্নলিখিত কমান্ডটি চালনা করেন তবে ব্যাশ ফাংশনটি সংজ্ঞায়িত হয়েছে এমন সমস্ত ফাইলের ফিরিয়ে দেওয়া উচিত।

grep -rnw 'Path2Search' -e "#!/bin/bash"

BASH প্রোগ্রামিং - ফাংশন | লিনাক্স ডকুমেন্টেশন প্রকল্প


1
কেবলমাত্র লিঙ্কের উত্তরগুলি একেবারে উত্সাহিত নয়। দয়া করে কিছু ব্যাখ্যা যুক্ত করুন।
হিমাইল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.