2012-06-18 19 views
9

सोर्सिंग से फ़ंक्शन कॉल की लाइन संख्या पाएं मैं यह जानने का प्रयास कर रहा हूं कि फ़ाइल और लाइन नंबर से कौन से फ़ंक्शन को कॉल किया गया था। फ़ंक्शन एक लाइब्रेरी फ़ाइल में है जिसे मेरी स्क्रिप्ट द्वारा सोर्स किया जा रहा है।बैश: फ़ाइल

file1:

$source file2 
$warn_me "Error: You didn't do something" 

करें 2:

$function warn_me() { 
$ message=???? 
$ echo ${message} 
$} 

वांछित आउटपुट:$: file1: पंक्ति 2: त्रुटि: तुम कुछ

नहीं किया

मज़ाक कई फाइलों में आयन कॉल पहले से ही कई बार होता है, इसलिए मैं इसे बदलने के बिना ऐसा करने का कोई तरीका ढूंढने की कोशिश कर रहा हूं।

पहले warn_me समारोह हर फ़ाइल है कि यह प्रयोग किया जाता में परिभाषित किया गया था और यह इतना तरह का ध्यान रखा गया था:

$local message="$BASH_SOURCE:(""${BASH_LINENO}): ""$*" 

उत्तर

7

वहाँ तीन सरणी चर कि इस उद्देश्य के लिए इस्तेमाल किया जा सकता हैं:

  • FUNCNAME
  • BASH_SOURCE
  • BASH_LINENO

अधिक जानकारी के लिए निम्नलिखित जवाब देखें:

10

आप caller ऐसा लगता है के लिए देख रहे हैं।

$ cat h.sh 
#! /bin/bash 
function warn_me() { 
    echo "[email protected]" 
    caller 
} 
$ cat g.sh 
#!/bin/bash 
source h.sh 
warn_me "Error: You didn't do something" 
$ . g.sh 
Error: You didn't do something 
3 g.sh 
+1

धन्यवाद, मैंने लाइन को प्रतिस्थापित कर दिया: $ स्थानीय संदेश = "$ BASH_SOURCE [1] :(" "$ {BASH_LINENO}):" "$ *" – spizzak

6

@nosid से प्रेरित होकर और @Wrikken मैं एक छोटे से समारोह में लिखा था एक चर $ ढेर कहा जाता में वर्तमान स्टैक ट्रेस डाल करने के लिए। यह कुछ उपयोगकर्ता के स्थान पर उपयोगकर्ता को आउटपुट करने के लिए उपयोगी हो सकता है। बहुत खराब बैश में अंतर्निहित प्रिंटस्टैकट्रेस नहीं है ... आशा है कि कोई इसे अपनी परियोजनाओं में आसान लगेगा।

function get_stack() { 
    STACK="" 
    local i message="${1:-""}" 
    local stack_size=${#FUNCNAME[@]} 
    # to avoid noise we start with 1 to skip the get_stack function 
    for ((i=1; i<$stack_size; i++)); do 
     local func="${FUNCNAME[$i]}" 
     [ x$func = x ] && func=MAIN 
     local linen="${BASH_LINENO[$((i - 1))]}" 
     local src="${BASH_SOURCE[$i]}" 
     [ x"$src" = x ] && src=non_file_source 

     STACK+=$'\n'" at: "$func" "$src" "$linen 
    done 
    STACK="${message}${STACK}" 
} 

अद्यतन: मैंने एक टाइपो तय किया और एक त्रुटि संदेश पैरामीटर जोड़ा। तो फ़ंक्शन का पहला पैरामीटर स्टैक ट्रेस में जोड़ने के लिए एक त्रुटि संदेश है। बीटीडब्ल्यू अगर आपकी स्क्रिप्ट bash के stdin (ज्यादातर मामलों में एक बुरा विचार) पर आपूर्ति की जाती है, तो पहली स्थिति खो जाएगी। यदि आवश्यक हो, तो for पाश में, इसे i<$stack_size + 1 पर बदलें। लेकिन जैसा कि मैंने कहा, आपकी स्क्रिप्ट को बाश के stdin, here's why पर फ़ीड करना अच्छा नहीं है।

अपडेट 2: मैंने पाया कि मेरे पास older answer है। एक स्थान पर कोड के अद्यतन संस्करण को बेहतर रखने के लिए सोचा। तो gist बनाने का फैसला किया। जिस्ट में सुधार का सुझाव देने के लिए स्वतंत्र महसूस करें। यदि कोई परिवर्तन होता है तो मैं इस उत्तर को अद्यतन रखने की कोशिश करूंगा लेकिन मैं गारंटी नहीं दे सकता।