কিভাবে একটি ফাংশন ভিতরে থেকে ফাংশন নাম নির্ধারণ


163

আমার কাছে যদি বাশ স্ক্রিপ্ট থাকে তবে:

#!/bin/bash

f() {
  # echo function name, "f" in this case
}

এই কাজ করতে কোন উপায় আছে কি? এটি যেমন সহায়তা বার্তাগুলিতে ব্যবহার করা যেতে পারে

printf "Usage: %s: blah blah blah \n" $(basename $0) >&2; 

শুধুমাত্র এই ক্ষেত্রে আমি $0যা চেয়েছিলাম তা নয় , যা স্ক্রিপ্টের ফাইলের নাম।


2
সম্পর্কিত: বাশ লগিং ফ্রেমওয়ার্ক যা FUNCNAMEঅ্যারে এবং অন্যান্য ব্যাশ ভেরিয়েবলগুলি ব্যবহার করে: github.com/codefirester/base/blob/master/lib/stdlib.sh । ফাংশন log_debug_enterএবং log_debug_leaveবিশেষত দেখুন।
কোডফোরস্টার

উত্তর:


236

আপনি ব্যবহার করতে পারেন ${FUNCNAME[0]}মধ্যে bashফাংশনের নাম জন্য।


79

থেকে ব্যাশ রেফারেন্স ম্যানুয়াল :

FUNCNAME

এক্সিকিউশন কল স্ট্যাকটিতে বর্তমানে সমস্ত শেল ফাংশনের নাম সম্বলিত একটি অ্যারে ভেরিয়েবল। সূচক 0 সহ উপাদানটি বর্তমানে কার্যকর হওয়া শেল ফাংশনের নাম। নীচের দিকের সর্বাধিক উপাদান (সর্বাধিক সূচকযুক্ত একটি) "প্রধান" main এই পরিবর্তনশীল কেবল তখনই উপস্থিত থাকে যখন শেল ফাংশন কার্যকর হয় exec FUNCNAME এ নিয়োগের কোনও প্রভাব নেই এবং ত্রুটির স্থিতি ফিরে আসে return FUNCNAME যদি সেট না করা থাকে তবে এটি পরে পুনরায় সেট করা হলেও এটি তার বিশেষ বৈশিষ্ট্যগুলি হারাবে।

এই চলকটি BASH_LINENO এবং BASH_SOURCE এর সাথে ব্যবহার করা যেতে পারে। কল স্ট্যাকটি বর্ণনা করার জন্য FUNCNAME এর প্রতিটি উপাদানের BASH_LINENO এবং BASH_SOURCE এ সম্পর্কিত উপাদান রয়েছে। উদাহরণস্বরূপ, line UN BUNH_SOURCE [$ i + 1] file ফাইল থেকে $ UN FUNCNAME [$ i] called ফাইলটি কল করা হয়েছিল {AS BASH_LINENO [$ i]}} কলার অন্তর্নির্মিত এই তথ্যটি ব্যবহার করে বর্তমান কল স্ট্যাকটি প্রদর্শন করে।

কোনও নির্দেশিকা ব্যতীত যখন বাশ অ্যারে অ্যাক্সেস করা হয় তখন অ্যারের প্রথম উপাদানটি ফিরে আসবে, তাই $FUNCNAMEতাত্ক্ষণিকভাবে বর্তমান ফাংশনটির নাম সরবরাহ করতে সাধারণ ক্ষেত্রে কাজ করবে, তবে এতে কল স্ট্যাকের অন্যান্য সমস্ত ফাংশনও রয়েছে। উদাহরণ স্বরূপ:

# in a file "foobar"
function foo {
    echo foo
    echo "In function $FUNCNAME: FUNCNAME=${FUNCNAME[*]}" >&2
}

function foobar {
    echo "$(foo)bar"
    echo "In function $FUNCNAME: FUNCNAME=${FUNCNAME[*]}" >&2
}

foobar

আউটপুট দেবে:

$ bash foobar
In function foo: FUNCNAME=foo foobar main
foobar
In function foobar: FUNCNAME=foobar main

6
আমি এখনও এটি পাই না। কেন [0]এটি অযৌক্তিক পরিবর্তনশীল অ্যাক্সেসের দ্বারা নিহিত থাকলে যুক্ত করবেন ?
টম হেল

15
কারণ এটি ভেরিয়েবলের আসল ধরণের প্রবঞ্চক এবং অজ্ঞ? অবশ্যই, এটি সবসময় প্রয়োজন হয় না, তবে অন্যান্য অনেক বাশ-আইসমের মতো এটি একটি অলস সম্মেলন। অস্পষ্টতার চেয়ে স্পষ্ট হওয়া ভাল।
bschlueter

36

আমি ${FUNCNAME[0]}বর্তমান ফাংশনটির নাম মুদ্রণ করতে ব্যবহার করি


@bschlueter কিন্তু আপনি যখন কোনও অ্যারেটিকে বাশের মতো অ্যারের মতো চিকিত্সা না করে রেফারেন্স করেন, এটি কেবল প্রথম মানটি মুদ্রণ করে; সুতরাং, গৃহীত উত্তর কীভাবে ভুল?
আলেকজ মাগুরা

4
অবশ্যই, এবং এটি সুবিধাজনক তবে রক্ষণাবেক্ষণ এবং পরীক্ষার জন্য ভয়ঙ্কর। অলস হবেন না, স্পষ্ট হয়ে উঠুন।
bschlueter

1

আরেকটি উদাহরণ:

# in a file "foobar"
foo() {
    echo "$FUNCNAME fuction begins"
}

foobar() {
    echo "$FUNCNAME fuction begins"
}

echo 'begin main'
foo
foobar
echo 'end main'

আউটপুট দেবে:

begin main
foo fuction begins
foobar fuction begins
end main

-1

ফাংশনটির নাম পাওয়ার সহজ উপায় (কোনও ফাংশনের অভ্যন্তর থেকে)

echo $0

###আপনার উত্তরগুলিতে গালি দেওয়া বন্ধ করুন ।
মার্সিন ওরোলোস্কি

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