বাশ ফাংশনটির সংজ্ঞা সন্ধান করা


41

আমি এমন একটি পরিবেশে কাজ করি যেখানে প্রচুর লিগ্যাসি শেল স্ক্রিপ্ট যাদু রয়েছে। কমান্ড লাইন থেকে ভারী ব্যবহৃত জিনিসটি হ'ল বাশ ফাংশন যা কিছু ফাইল থেকে অন্তর্ভুক্ত কিছু ফাইল থেকে সঞ্চিত হয় ... আমার .bash_profile এ অন্তর্ভুক্ত। এই ফাংশনগুলির সংজ্ঞাটির আরও 5 টি স্তরের অন্তর্ভুক্ত না করে ট্র্যাকিং ছাড়াই সংজ্ঞাটি পাওয়ার আরও ভাল উপায় আছে কি?

উত্তর:


39

ফাংশন সংজ্ঞা পেতে:

type -a function_name


আপনি যদি কখনও গ্র্যান্ড র‌্যাপিডে থাকেন তবে আমি আপনাকে ব্যক্তিগতভাবে একটি কিনব ... অন্যথায় আমরা অন্য কোনও উপায় খুঁজে পেতে পারি ...
আইকনোক্লাস্ট

whence -f function_nameইনzsh
ডিজেজা

66

ধরে নিচ্ছি আপনার foo নামে একটি ফাংশন রয়েছে নীচের কমান্ডগুলি ফাংশনটির সংজ্ঞাটির অবস্থান পাবেন, এটি হ'ল ফাইলটির নাম যেখানে ফাংশনটি সংজ্ঞায়িত করা হয়েছে সেই সাথে লাইন নম্বরটিও পাবেন যেখানে ফাংশনটি সেই ফাইলে সংজ্ঞায়িত করা হয়েছে ।

# Turn on extended shell debugging
shopt -s extdebug

# Dump the function's name, line number and fully qualified source file  
declare -F foo

# Turn off extended shell debugging
shopt -u extdebug

আমার ক্ষেত্রে এই কমান্ডগুলির ফলাফল:

foo 32 /source/private/main/developer/cue.pub.sh

3
পারফেক্ট। আমি এটিকে আমার বাশার্ক ফাইলে একটি ব্যাশ ফাংশনে পরিণত করেছি। whereisfunc() {shopt -s extdebug;declare -F $1;shopt -u extdebug}
নিল

5
@ নীল: এটি সহজ, ধন্যবাদ: আমাকে shoptবর্তমান শেলের অবস্থা পরিবর্তন না করে এর প্রভাব স্থানীয়করণের জন্য সাবসেল ব্যবহার করার পরামর্শ দিন : whichfunc () ( shopt -s extdebug; declare -F "$1"; )( (...)পরিবর্তে এর ব্যবহারটি নোট করুন {...})।
mklement0

কেন এই আদেশগুলি কোনও স্ক্রিপ্ট থেকে কাজ করে না? ফাংশনটি সঠিকভাবে কাজ করে
albfan

1
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
দ্রবীভূত

11

ফাংশনটির সংজ্ঞা দেখতে (যেখানে এটি এসেছে তার বিপরীতে) ব্যবহার করুন:

declare -f <functionname>

আমার মনে হয় type -aএটির চেয়ে ভাল কারণ এটি বিরক্ত লোকাল নির্ভর প্রথম লাইনে প্রিন্ট করে না
y

1
তবে যেহেতু কোনও স্থান দেওয়া হয়নি তা হ'ল একটি অনস্ক্রিত প্রশ্নের উত্তর — কমপক্ষে এখানে
আইকনোক্লাস্ট

6

bash -xএটি শুরু হওয়ার সাথে সাথে কী চলছে তা ছড়িয়ে দেবে, যা আপনাকে আরও সহজে এটি আবিষ্কার করতে দেয়। সদ্য খোলা শেল থেকে প্রস্থান করতে ভুলবেন না।


হ্যান্ডি স্টাফ; কোনও ফাইলটিতে ট্রেস ক্যাপচার করতে ব্যবহার করুন script out.txt bash -x(আবার, ভুলে যাবেন না exit)।
mklement0

-2

আরেকটি উপায়, যা আমি ইদানীং আরও সহজ দেখতে পেয়েছি:

  which <functionname>

(এটি এটি উপনাম বা স্ক্রিপ্ট কিনা তাও দেখায় তবে এটি একটি উপন্যাসের উত্স সন্ধান করবে না)


2
আমি মনে করি না যে whichবিএসডি বা ম্যাকের এলিয়াস সম্পর্কে তথ্য দেয়। এছাড়াও, এই প্রশ্নটি ফাংশন সম্পর্কে, এবং whichফাংশন সম্পর্কিত তথ্য দেয় না।
dbn

এই নোটের জন্য ধন্যবাদ। আমি এখন দেখতে পাচ্ছি যে "যা" কেবল zsh এ ফাংশনগুলি সমাধান করে, বাশ নয়।
জোশুয়া গোল্ডবার্গ

2
আমি মনে করি যে এই উত্তরটি ডাউনভোটদের আমন্ত্রণ জানাতে পারে ... অবস্থানটিতে কোনও তথ্য নেই বলে এটিকে প্রশ্নটির মোটেই সমাধান করা হবে বলে মনে হয় না।
আইকনোক্লাস্ট

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