मैं शीर्ष पर चल रहे ओपनबॉक्स के साथ Ubuntu 10.10 चला रहा हूं। मैंने देखा कि आज एक कमांड कहा जाता है caller
, हालांकि कोई मैन पेज नहीं है, यह किसी भी इनपुट (या-help) का जवाब नहीं देता है और जहां इसे कहते हैं।
कुछ पता है यह क्या है?
मैं शीर्ष पर चल रहे ओपनबॉक्स के साथ Ubuntu 10.10 चला रहा हूं। मैंने देखा कि आज एक कमांड कहा जाता है caller
, हालांकि कोई मैन पेज नहीं है, यह किसी भी इनपुट (या-help) का जवाब नहीं देता है और जहां इसे कहते हैं।
कुछ पता है यह क्या है?
जवाबों:
Daud
type caller
और आप देखेंगे कि यह एक शेल निर्मित है। चल रहा है
help caller
अपने कार्य को दिखाएगा, जो बश के मैनुअल पेज में भी बताया गया है। संक्षिप्त
Return the context of the current subroutine call.
help
कमांड है
type type
, type help
, help type
और help help
चलाने के लिए :) आसान हो सकता है
caller
अंतर्निहित आदेश (इसे POSIX द्वारा निर्दिष्ट नहीं) बैश संस्करण 3.0 में दिखाई दिया है और यह किसी भी सक्रिय सबरूटीन कॉल के संदर्भ देता है। देखें: अधिक पढ़ने के लिए बैश-बिलिन ।
वाक्य - विन्यास:
caller [FRAMENUMBER]
यदि फ़्रेम नंबर को एक गैर-नकारात्मक पूर्णांक के रूप में आपूर्ति की जाती है, तो यह वर्तमान निष्पादन कॉल स्टैक में उस स्थिति के अनुरूप लाइन नंबर, सबरूटीन नाम और स्रोत फ़ाइल प्रदर्शित करता है।
किसी भी पैरामीटर के बिना, कॉलर वर्तमान सबरूटीन कॉल की लाइन संख्या और स्रोत फ़ाइल नाम प्रदर्शित करता है।
बैश हैकर्स विकी पर निम्नलिखित सरल स्टैक ट्रेस देखें :
#!/bin/bash
die() {
local frame=0
while caller $frame; do
((frame++));
done
echo "$*"
exit 1
}
f1() { die "*** an error occured ***"; }
f2() { f1; }
f3() { f2; }
f3
आउटपुट:
12 f1 ./callertest.sh
13 f2 ./callertest.sh
14 f3 ./callertest.sh
16 main ./callertest.sh
*** an error occured ***
die
मामूली जटिल लिपियों में त्रुटियों को ट्रैक करने के लिए यहां एक सभ्य कार्य का नमूना है :
{ bash /dev/stdin; } <<<$'f(){ g; }\ng(){ h; }\nh(){ while caller $((n++)); do :; done; }\nf'
अधिक परिष्कृत डिबगिंग के लिए, बैश विस्तारित डिबगिंग सुविधाएँ उपलब्ध हैं और कई विशेष पैरामीटर हैं जो कॉलर (जैसे
BASH_ARG{C,V}
) से अधिक विवरण देते हैं । बाशब जैसे उपकरण बाश के कुछ और उन्नत डीबग सुविधाओं का उपयोग करने में सहायता कर सकते हैं।
ध्यान दें कि आप चर में read
आउटपुट कर सकते हैं caller
, यह नियंत्रित करने के लिए कि इसका आउटपुट स्वरूपित कैसे किया जाता है:
stacktrace() {
local frame=0 LINE SUB FILE
while read LINE SUB FILE < <(caller "$frame"); do
echo "${SUB} @ ${FILE}:${LINE}"
((frame++))
done
}
डेमो:
$ cat /tmp/caller.sh
#!/bin/bash
stacktrace() {
local frame=0 LINE SUB FILE
while read LINE SUB FILE < <(caller "$frame"); do
printf ' %s @ %s:%s' "${SUB}" "${FILE}" "${LINE}"
((frame++))
done
}
die() {
echo "$*"
stacktrace
exit 1
}
f1() { die "*** an error occured ***"; }
f2() { f1; }
f3() { f2; }
f3
$ bash /tmp/caller.sh
*** an error occured ***
die @ /tmp/caller.sh:13
f1 @ /tmp/caller.sh:17
f2 @ /tmp/caller.sh:18
f3 @ /tmp/caller.sh:19
main @ /tmp/caller.sh:21