আমি ওবুন্টু ১০.১০ চালাচ্ছি ওপেনবক্স ওপরে চলছে। আমি আজ একটি কমান্ড ডেকে লক্ষ্য করেছি caller
, তবে সেখানে কোনও ম্যান পেজ নেই, এটি কোনও ইনপুট (বা --help) তে সাড়া দেয় না এবং এটি এটি খুঁজে পায় না।
ইহা কি এই সম্পর্কে কোন মতামত?
আমি ওবুন্টু ১০.১০ চালাচ্ছি ওপেনবক্স ওপরে চলছে। আমি আজ একটি কমান্ড ডেকে লক্ষ্য করেছি caller
, তবে সেখানে কোনও ম্যান পেজ নেই, এটি কোনও ইনপুট (বা --help) তে সাড়া দেয় না এবং এটি এটি খুঁজে পায় না।
ইহা কি এই সম্পর্কে কোন মতামত?
উত্তর:
চালান
type caller
এবং আপনি দেখতে পাবেন এটি অন্তর্নির্মিত একটি শেল। চলমান
help caller
বাশ এর ম্যানুয়াল পৃষ্ঠায় রিপোর্ট করা এর ফাংশনটি প্রদর্শন করবে। সংক্ষেপে
Return the context of the current subroutine call.
help
type type
, type help
, help type
এবং help help
চালানোর জন্য :) মজা হতে পারে
caller
Builtin কমান্ড (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