असाइन करें और बैश फ़ंक्शन मेटाडेटा का निरीक्षण करें


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
हम्म, बाश में डॉकस्ट्रिंग्स। किसे पता था?
ब्रायन मिंटन

क्या उस टिप्पणी को क्वेरी करने का कोई तरीका है? मैं सभी आदेशों के लिए एक जीनरी हेल्प फंक्शन पर सोच रहा हूं।
23

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
यदि आप किसी वैरिएबल को स्टोर करने से बचना चाहते हैं, तो आप nop ऑपरेटर का उपयोग कर सकते हैं ":" इस तरह:
फंक

1
मुझे लगता है कि सिंगल कोट्स यहां दोहरे उद्धरण चिह्नों से बेहतर हैं, बस अगर किसी अनचाहे विस्तार को डॉकस्ट्रिंग में छिपाया जाता है
डिजिटल ट्रॉमा

6

आप एनओपी बिलिन का उपयोग कर सकते हैं :। इसके अलावा, आपको इसे एक चर के रूप में संग्रहीत करने की आवश्यकता नहीं है:

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 यह होगा। यह सिर्फ एक दृष्टांत है। कोशिश करो। इसकी सीमाएँ हालांकि हैं। कोई विशेष वर्ण (उपयोग नहीं किया जा सकता है और पहला शब्द एक मान्य कमांड नहीं होना चाहिए।

ठीक है। यह लगता है कि यह एक मान्य उत्तर है, हालांकि इसे चलाने के लिए एक अतिरिक्त समय लगता है। इसके अलावा इको और मेटाडेटा को शामिल करना बेहतर होगा जो मैंने अपने उदाहरण में उपयोग किया है।
yucer
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.