বাশ ফাংশন মেটাডেটা নির্ধারণ এবং পরিদর্শন করুন


10

আমি প্রায়শই প্রচুর পরিমাণে ব্যাশ ফাংশন উত্পন্ন এবং নিবন্ধভুক্ত করি যা আমি সাধারণত আমার উন্নয়ন প্রকল্পগুলিতে করি এমন অনেকগুলি কাজ স্বয়ংক্রিয় করে তোলে। সেই প্রজন্মটি আমি যে প্রকল্পে কাজ করছি তার মেটা-ডেটা নির্ভর করে।

আমি যে প্রকল্পটি তাদের উত্পন্ন হয়েছিল তার তথ্য সহ ফাংশনগুলি বর্নিত করতে চাই:

func1() {
# This function was generated for project: PROJECT1
echo "do my automation"
}

আদর্শভাবে, আমি সংজ্ঞাটি পরিদর্শন করার সময় মন্তব্যটি দেখতে সক্ষম হব:

$ type func1

func1 is a function
func1 () 
{
    # This function was generated for project: PROJECT1
    echo "do my automation"
}

তবে কোনওভাবে বাশ ফাংশনটি লোড করার মুহুর্তে মন্তব্যগুলি এড়িয়ে চলবে বলে মনে হয়, এটি কার্যকর করার সময় নয়। সুতরাং মন্তব্যগুলি হারিয়ে গেছে এবং আমি এই ফলাফলটি পেয়েছি:

func1 is a function
func1 () 
{
    echo "do my automation"
}

ফাংশনে মেটাডেটা নির্ধারিত করার এবং পরে সেগুলি পরীক্ষা করার কোনও উপায় আছে কি? টাইপ সহ সংজ্ঞাটি পরীক্ষা করার সময় এটি পুনরুদ্ধার করা সম্ভব?


1
কোনও সমাধান নয় (তাই মন্তব্য), তবে আমি যে ওয়ার্ক-এভার ব্যবহার করি তা $1হ'ল কিনা তা পরীক্ষা করা -hএবং তারপরে printf/ echoএকটি এক-লাইন সহায়তা / ব্যবহার / যাই হোক না কেন।
জন এন

উত্তর:


13
function func_name()
{
  : '
  Invocation:   func_name $1 $2 ... $n
  Function:     Display the values of the supplied arguments, in double quotes.
  Exit status:  func_name always returns with exit status 0.
  ' :
  local i
  echo "func_name: $# arguments"
  for ((i = 1; i <= $#; ++i)); do
    echo "func_name [$i] \"$1\""
    shift
  done
  return 0
}

2
হুমম, ব্যাশে ডক্টরিস্টিং। কে জানত?
ব্রায়ান মিন্টন

মন্তব্যটি জিজ্ঞাসা করার কোনও উপায় আছে কি? আমি সমস্ত কমান্ডের জন্য উদার সহায়তা ফাংশন নিয়ে ভাবছি।
ইয়ুসার

7

হ্যাঁ, typeকেবল চালানো কোনও ফাংশনের অংশগুলি মুদ্রণ করে দেখায়। এটি আমার কাছে যুক্তিযুক্ত বলে মনে হচ্ছে, যেহেতু সাধারণত জিজ্ঞাসাবাদ করার সময় আপনার আগ্রহী type

কার্যতালিকা হিসাবে, মন্তব্যগুলি ব্যবহার করার পরিবর্তে আপনার মেটা ডেটা যুক্ত করুন:

func1() {
    meta="This function was generated for project: PROJECT1"
    echo "do my automation"
}

আসলে সেই পরিবর্তনশীলটি ব্যবহার করার দরকার নেই, তবে ফাংশনটি জিজ্ঞাসাবাদ করার সময় এটি উপস্থিত হবে type:

$ type func1
func1 is a function
func1 () 
{ 
    meta="This function was generated for project: PROJECT1";
    echo "do my automation"
}

2
আপনি যদি কোনও ভেরিয়েবল সংরক্ষণ করে এড়াতে চান, আপনি নপ অপারেটরটি ":" এইভাবে ব্যবহার করতে পারেন: ফাংশন ফানক () ":" মেটাডেটা "# আপনার করুন}
লুচোস্টেইন

1
আমি মনে করি যে এখানে একক উদ্ধৃতিগুলি ডাবল উদ্ধৃতিগুলির চেয়ে ভাল, কেবলমাত্র যদি ডাস্ট্রিংয়ে কোনও অযাচিত বিস্তৃতি লুকিয়ে থাকে
ডিজিটাল ট্রমা

6

আপনি ব্যবহার করতে পারেন nop builtin :। তদ্ব্যতীত, আপনার এটিকে ভেরিয়েবল হিসাবে সংরক্ষণ করার দরকার নেই:

function f() {
  : your metadata here
  : "or here"
  # do yours
}

সম্পাদনা : আপনার মেটাডেটাতে বিশেষ অক্ষর থেকে সাবধান থাকুন। খাঁটি পাঠ্যের জন্য, আপনি ব্যবহার করতে পারেন:

: <<EOT
Your metadata text here.
EOT

সম্পাদনা : আপনি সমস্ত ফাংশনটির মেটাডেটা সঞ্চয় করতে পরিবর্তে একটি বিশ্বব্যাপী সহযোগী অ্যারে ব্যবহার করতে পারেন:

declare -A METADATA=()
METADATA[fun1]='foo bar'
function fun1() {
  echo I have some metadata: "${METADATA[$FUNCNAME]}"
}
METADATA[fun2]='baz you'
function fun2() {
  echo I have some other metadata: "${METADATA[$FUNCNAME]}"
}

এইভাবে, আপনাকে বিশ্লেষণ declareবা typeআউটপুট আউট করার দরকার নেই, তবে কেবল অ্যারের কীটির জন্য কোয়েরি করতে হবে।


1
সতর্কতা অবলম্বন করুন - এর মধ্যে your metadata hereপার্শ্ব-প্রতিক্রিয়া থাকতে পারে এমন বিস্তৃতি থাকতে পারে। @ অ্যালেক্সপির উত্তরের মতো একক উদ্ধৃতি ব্যবহার করা ভাল।
ডিজিটাল ট্রমা

হ্যাঁ, তবে আপনার উদ্ধৃতিগুলির ভিতরেও সাবধান হওয়া উচিত।
লুচোস্টেইন

3

তুমি এটি করতে পারো.

$ f() { This function does nothing. 2> /dev/null; }
$ f
$ type f
f is a function
f () 
{ 
    This function does nothing. 2> /dev/null
}

তবে ফাংশনটি টীকাযুক্ত হওয়ার পরেও তার স্টাফটি করা উচিত। আমি যখন নমুনায় ইকো অন্তর্ভুক্ত করি তখনও কাজ করা উচিত যখন আমি ফাংশনটি সাধারণত কল করি।
yucer

পছন্দ করুন এটি কেবল একটি চিত্রণ। চেষ্টা করে দেখুন যদিও এর সীমাবদ্ধতা রয়েছে। বিশেষ কোনও অক্ষর (ব্যবহার করা যাবে না এবং প্রথম শব্দটি একটি বৈধ কমান্ড হওয়া উচিত নয়।

ঠিক আছে. এটি মনে হয় এটি একটি বৈধ উত্তর, যদিও এটি চালাতে অতিরিক্ত সময় নেয়। ইকো এবং মেটাডেটা যা আমি আমার উদাহরণটিতে ব্যবহার করেছি তা অন্তর্ভুক্ত করা ভাল।
ইয়ুসার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.