"कॉलर" कमांड क्या है?


13

मैं शीर्ष पर चल रहे ओपनबॉक्स के साथ Ubuntu 10.10 चला रहा हूं। मैंने देखा कि आज एक कमांड कहा जाता है caller, हालांकि कोई मैन पेज नहीं है, यह किसी भी इनपुट (या-help) का जवाब नहीं देता है और जहां इसे कहते हैं।

कुछ पता है यह क्या है?

जवाबों:


17

Daud

type caller

और आप देखेंगे कि यह एक शेल निर्मित है। चल रहा है

help caller

अपने कार्य को दिखाएगा, जो बश के मैनुअल पेज में भी बताया गया है। संक्षिप्त

Return the context of the current subroutine call.


3
बहुत बढ़िया। न केवल मैंने सीखा कि कमांड क्या करती है, मैं "प्रकार" कमांड भी सीखता हूं। धन्यवाद :)

2
TIL bash में एक अंतर्निहित helpकमांड है
nibot

न केवल उत्तर बल्कि प्रक्रिया के रूप में पढ़ाने के लिए मैं दो बार उत्थान कर सका।
dmckee --- पूर्व-मध्यस्थ बिल्ली का बच्चा

@Muu, @nibot, @dmckee: भी type type, type help, help typeऔर help helpचलाने के लिए :) आसान हो सकता है
enzotib

11

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}) से अधिक विवरण देते हैं । बाशब जैसे उपकरण बाश के कुछ और उन्नत डीबग सुविधाओं का उपयोग करने में सहायता कर सकते हैं।


2

यह शेल बिल्ड कमांड है: man bash(फिर 'कॉलर' की खोज करें)
इसका उपयोग स्टैक ट्रेस को प्रिंट करने के लिए किया जा सकता है।


धन्यवाद हालांकि मैंने enzotib का जवाब चुना क्योंकि उन्होंने मुझे 'टाइप' भी सिखाया। बहुत धन्यवाद हालांकि :)

0

ध्यान दें कि आप चर में 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.