"আহ্বানকারী" আদেশ কি?


12

আমি ওবুন্টু ১০.১০ চালাচ্ছি ওপেনবক্স ওপরে চলছে। আমি আজ একটি কমান্ড ডেকে লক্ষ্য করেছি caller, তবে সেখানে কোনও ম্যান পেজ নেই, এটি কোনও ইনপুট (বা --help) তে সাড়া দেয় না এবং এটি এটি খুঁজে পায় না।

ইহা কি এই সম্পর্কে কোন মতামত?

উত্তর:


16

চালান

type caller

এবং আপনি দেখতে পাবেন এটি অন্তর্নির্মিত একটি শেল। চলমান

help caller

বাশ এর ম্যানুয়াল পৃষ্ঠায় রিপোর্ট করা এর ফাংশনটি প্রদর্শন করবে। সংক্ষেপে

Return the context of the current subroutine call.


3
অসাধারণ. এই কমান্ডটি কী করে তা কেবল আমি শিখেছি না, তবে "টাইপ" কমান্ডটিও শিখেছি। ধন্যবাদ :)

2
টিআইএল help
বাশের

যা আমি কেবল উত্তরটি নয়, প্রক্রিয়াটিও শেখানোর জন্য দু'বার উপস্থাপন করতে পারি।
ডিএমকেকে --- প্রাক্তন মডারেটর বিড়ালছানা

@Muu, @nibot, @dmckee: এছাড়াও type type, type help, help typeএবং help helpচালানোর জন্য :) মজা হতে পারে
enzotib

10

callerBuiltin কমান্ড (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(তারপরে 'কলার' সন্ধান করুন)
এটি স্ট্যাক ট্রেস প্রিন্ট করতে ব্যবহার করা যেতে পারে।


ধন্যবাদ যদিও আমি এনজোটিবের উত্তরটি বেছে নিয়েছিলাম কারণ তিনি আমাকে 'টাইপ' শিখিয়েছিলেন। যদিও অনেক ধন্যবাদ :)

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.