কোনও বাশ স্ক্রিপ্ট ডিবাগ করার কোনও উপায় আছে? উদাহরণস্বরূপ এমন কিছু যা "কলিং লাইন 1", "কলিং লাইন 2" ইত্যাদির মতো একজাতীয় লগ প্রিন্ট করে etc.
কোনও বাশ স্ক্রিপ্ট ডিবাগ করার কোনও উপায় আছে? উদাহরণস্বরূপ এমন কিছু যা "কলিং লাইন 1", "কলিং লাইন 2" ইত্যাদির মতো একজাতীয় লগ প্রিন্ট করে etc.
উত্তর:
sh -x script [arg1 ...]
bash -x script [arg1 ...]
এগুলি আপনাকে কার্যকর করা হচ্ছে তার একটি চিহ্ন দেয়। (উত্তরের নীচে 'স্পষ্টকরণ' দেখুন See)
কখনও কখনও, আপনাকে স্ক্রিপ্টের মধ্যে ডিবাগিং নিয়ন্ত্রণ করতে হবে। সেক্ষেত্রে , চিতো যেমন আমাকে মনে করিয়ে দিয়েছে, আপনি ব্যবহার করতে পারেন:
set -x
এটি ডিবাগিং চালু করে। তারপরে আপনি এটিকে আবার বন্ধ করে দিতে পারেন:
set +x
(আপনি বিশ্লেষণ করে বর্তমান ট্রেসিং স্টেটটি সন্ধান করতে পারবেন $-
, বর্তমান পতাকাগুলি, এর জন্য x
।)
এছাড়াও, শেলগুলি সাধারণত -n
'এক্সিকিউশন না -v
' এর জন্য '' এবং 'ভার্বোজ' মোডের জন্য '' বিকল্প সরবরাহ করে; শেলটি এটি আপনার স্ক্রিপ্টটি কার্যকর করতে পারে কিনা তা মনে করে আপনি এটি সংমিশ্রণে ব্যবহার করতে পারেন - আপনার কোথাও ভারসাম্যহীন উক্তি থাকলে মাঝে মাঝে দরকারী useful
বিতর্ক রয়েছে যে -x
বাশের ' ' অপশনটি অন্যান্য শেল থেকে আলাদা (মন্তব্যগুলি দেখুন)। ব্যাশ ম্যানুয়াল বলেছেন:
-এক্স
সরল কমান্ড, for
কমান্ড, case
কমান্ড, select
কমান্ড এবং গাণিতিক for
কমান্ড এবং তাদের যুক্তি বা যুক্ত শব্দ তালিকার একটি ট্রেস প্রসারিত হওয়ার পরে এবং কার্যকর করার পূর্বে মুদ্রণ করুন । PS4
ভেরিয়েবলের মান প্রসারিত হয় এবং ফলস্বরূপ মানটি কমান্ড এবং এর প্রসারিত আর্গুমেন্টের আগে মুদ্রিত হয়।
এগুলি মোটেই আলাদা আচরণের ইঙ্গিত দেয় বলে মনে হয় না। আমি -x
ম্যানুয়ালটিতে ' ' এর সাথে অন্য কোনও প্রাসঙ্গিক উল্লেখ দেখতে পাচ্ছি না । এটি স্টার্টআপ ক্রমের পার্থক্য বর্ণনা করে না।
স্পেসিফিকেশন : একটি লিনাক্স লিনাক্স বাক্সের মতো সিস্টেমে, যেখানে ' /bin/sh
' ' ' র একটি ' সিমলিংক /bin/bash
' (বা বাশ এক্সিকিউটেবল যেখানেই পাওয়া যায়), দুটি কমান্ড লাইন এক্সিকিউশন ট্রেস ব্যবহার করে স্ক্রিপ্টটি চালনার সমান প্রভাব অর্জন করে। অন্যান্য সিস্টেমে (উদাহরণস্বরূপ, সোলারিস এবং লিনাক্সের আরও কয়েকটি আধুনিক রূপগুলি) /bin/sh
বাশ নয়, এবং দুটি কমান্ড লাইনই (কিছুটা) আলাদা ফলাফল দেয়। সবচেয়ে উল্লেখযোগ্যভাবে, ' /bin/sh
' বাশের কন্সট্রাকশন দ্বারা বিভ্রান্ত হবে যে এটি একেবারেই স্বীকৃতি দেয় না। (সোলারিসে, /bin/sh
এটি একটি বোর্ন শেল; আধুনিক লিনাক্সে এটি কখনও কখনও ড্যাশ হয় - একটি ছোট, আরও কঠোরভাবে পসিক্স-কেবল শেল this) যখন নামটির সাথে অনুরোধ করা হয় তখন 'শেবাং' লাইন (' #!/bin/bash
' বনাম '#!/bin/sh
)
ব্যাশ ম্যানুয়ালটিতে ব্যাশ পসিক্স মোডে একটি বিভাগ রয়েছে যা এই উত্তরের দীর্ঘস্থায়ী তবে ভ্রান্ত সংস্করণের বিপরীতে (নীচে মন্তব্যগুলিও দেখুন), 'ব্যাশকে আহ্বান করা sh
' এবং 'বাশকে আহ্বান জানানো হিসাবে পার্থক্যটি বিস্তৃতভাবে বর্ণনা করে bash
'।
একটি (বাশ) শেল স্ক্রিপ্ট ডিবাগ করার সময়, -x
বিকল্পটির সাথে শেবাং লাইনে নাম করা শেলটি ব্যবহার করা বুদ্ধিমান এবং বুদ্ধিমান - প্রয়োজনীয় এমনকি - হবে । অন্যথায়, আপনি স্ক্রিপ্টটি চলাকালীন ডিবাগ করার সময় (করবে?) আলাদা আচরণ পেতে পারেন।
bash
স্ক্রিপ্ট নির্দিষ্ট করেছেন । এবং এর সাথে ব্যাশ স্ক্রিপ্ট চালানো sh -x
একে সম্পূর্ণ আলাদা আচরণের কারণ করবে! আপনার উত্তর আপডেট করুন।
export PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'
আমি আমার স্ক্রিপ্টটি ডিবাগ করার জন্য নিম্নলিখিত পদ্ধতিগুলি ব্যবহার করেছি।
set -e
কোনও বাহ্যিক প্রোগ্রাম যদি শূন্য-বহির্গমন স্থিতি ফিরে দেয় তবে স্ক্রিপ্টটি তত্ক্ষণাত বন্ধ করে দেয়। আপনার স্ক্রিপ্টটি যদি ত্রুটিযুক্ত সমস্ত ক্ষেত্রে পরিচালনা করার চেষ্টা করে এবং যেখানে এটি করতে ব্যর্থতা আটকে থাকে তবে এটি কার্যকর।
set -x
উপরে উল্লিখিত ছিল এবং অবশ্যই সমস্ত ডিবাগিং পদ্ধতিগুলির মধ্যে সবচেয়ে দরকারী।
set -n
আপনি যদি সিন্টেক্স ত্রুটির জন্য আপনার স্ক্রিপ্টটি পরীক্ষা করতে চান তবে এটি কার্যকরও হতে পারে।
strace
কী চলছে তা দেখতেও দরকারী। বিশেষত দরকারী যদি আপনি নিজে স্ক্রিপ্টটি না লিখে থাকেন।
strace -f
আপনি যদি স্ক্রিপ্ট দ্বারা শুরু হওয়া প্রক্রিয়াগুলিতে ত্রুটিও খুঁজে পেতে চান তবে সেই নোটটি প্রয়োজনীয়। (এটি এটিকে বহুগুণ ভার্বোজের করে তোলে তবে আপনি যদি এটি আগ্রহী সেই সিস্টেমে সীমাবদ্ধ রাখেন তবে এখনও দরকারী)।
set -e
হয় ... পরস্পরবিরোধী ।
এই উত্তরটি বৈধ এবং দরকারী: https://stackoverflow.com/a/951352
তবে, আমি দেখতে পেয়েছি যে "স্ট্যান্ডার্ড" স্ক্রিপ্ট ডিবাগিং পদ্ধতিগুলি অদক্ষ, অজ্ঞাতনামা এবং ব্যবহার করা শক্ত। অত্যাধুনিক জিইউআই ডিবাগারগুলির জন্য যাঁরা সবকিছু আপনার নখদর্পণে রেখেছেন এবং কাজটিকে সহজ সমস্যার (এবং কঠিন সমস্যার পক্ষে সম্ভব) জন্য একটি হাওয়া বানাচ্ছে তাদের জন্য, এই সমাধানগুলি খুব সন্তোষজনক নয়।
আমি যা করি তা হ'ল ডিডিডি এবং বাশদ্বির সংমিশ্রণটি ব্যবহার করা। পূর্ববর্তীটি পরবর্তীকর্ম সম্পাদন করে এবং দ্বিতীয়টি আপনার স্ক্রিপ্টটি কার্যকর করে। এটি আপনার মাথায় প্রসঙ্গ বজায় রাখার জন্য ধ্রুব মানসিক প্রয়াস ছাড়াই বা উত্সটিকে পুনরায় তালিকাভুক্ত রাখার প্রসঙ্গে কোডের মধ্য দিয়ে পদক্ষেপ গ্রহণের এবং ভেরিয়েবলগুলি, স্ট্যাক ইত্যাদির দেখার ক্ষমতা সহ একাধিক উইন্ডো ইউআই সরবরাহ করে।
এটি সেট আপ করার বিষয়ে এখানে গাইডেন্স রয়েছে: http://ubuntuforums.org/showthread.php?t=660223
আপনি স্ক্রিপ্টের মধ্যে "সেট-এক্স "ও লিখতে পারেন।
আমি শেলচেক ইউটিলিটিটি পেয়েছি এবং কিছু লোকেরা এটি আকর্ষণীয় বলে মনে হতে পারে https://github.com/koalaman/shellcheck
একটি সামান্য উদাহরণ:
$ cat test.sh
ARRAY=("hello there" world)
for x in $ARRAY; do
echo $x
done
$ shellcheck test.sh
In test.sh line 3:
for x in $ARRAY; do
^-- SC2128: Expanding an array without an index only gives the first element.
বাগ ঠিক করুন, প্রথমে চেষ্টা করুন ...
$ cat test.sh
ARRAY=("hello there" world)
for x in ${ARRAY[@]}; do
echo $x
done
$ shellcheck test.sh
In test.sh line 3:
for x in ${ARRAY[@]}; do
^-- SC2068: Double quote array expansions, otherwise they're like $* and break on spaces.
আবার চেষ্টা করা যাক...
$ cat test.sh
ARRAY=("hello there" world)
for x in "${ARRAY[@]}"; do
echo $x
done
$ shellcheck test.sh
এখন খুঁজুন!
এটি একটি ছোট উদাহরণ।
প্লাগইনগুলি শেলড এবং বাশেক্লিপসে গ্রহটি ব্যবহার করুন।
https://sourceforge.net/projects/shelled/?source=directory https://sourceforge.net/projects/basheclipse/?source=directory
শেল্ডের জন্য: জিপটি ডাউনলোড করুন এবং সাহায্যের মাধ্যমে এটি গ্রহনে আমদানি করুন -> নতুন সফ্টওয়্যার ইনস্টল করুন: স্থানীয় আর্কাইভ বাশেখ্রিপ্সের জন্য: জারগুলি গ্রহটির ড্রপিন ডিরেক্টরিতে অনুলিপি করুন
Https://sourceforge.net/projects/basheclipse/files/?source=navbar সরবরাহিত পদক্ষেপগুলি অনুসরণ করুন
আমি http://dietrichschroff.blogspot.de/2017/07/bash-enabling-eclipse-for-bash.html এ অনেক স্ক্রিনশট সহ একটি টিউটোরিয়াল লিখেছিলাম
আমি একটি ব্যাশ ডিবাগার তৈরি করেছি। শুধু এটা ব্যবহার করে দেখুন। আমি আশা করি এটি https://sourceforge.net/projects/bashdebugingbash সহায়তা করবে
সেট + x = @ECHO অফ, সেট -x = @ECHO চালু।
আপনি -xv
নীচে স্ট্যান্ডার্ড শেবাংয়ের বিকল্প যুক্ত করতে পারেন :
#!/bin/bash -xv
-x
: কার্যকর করার সাথে সাথে কমান্ড এবং তাদের যুক্তি প্রদর্শন করুন।
-v
: শেল ইনপুট লাইনগুলি পড়ার সাথে প্রদর্শন করুন।
ltrace
এর মতো অন্য লিনাক্স ইউটিলিটি strace
। তবে, ltrace
এক্সিকিউটেবল বা একটি চলমান প্রক্রিয়াতে কল করা সমস্ত লাইব্রেরি কলকে তালিকাবদ্ধ করে। এটির নামটি নিজেই লাইব্রেরি-কল ট্রেসিং থেকে আসে। উদাহরণ স্বরূপ:
ltrace ./executable <parameters>
ltrace -p <PID>
আমি মনে করি আপনি এই ব্যাশ ডিবাগারটি চেষ্টা করতে পারেন: http://bashdb.sourceforge.net/ ।
set -[nvx]
এ ছাড়াও
set -x
এবং
set +x
ডাম্প বন্ধ করার জন্য
আমি set -v
উইচ ডাম্প সম্পর্কে কম বিকাশিত আউটপুট হিসাবে ছোট হিসাবে বলতে চাই ।
bash <<<$'set -x\nfor i in {0..9};do\n\techo $i\n\tdone\nset +x' 2>&1 >/dev/null|wc -l
21
for arg in x v n nx nv nvx;do echo "- opts: $arg"
bash 2> >(wc -l|sed s/^/stderr:/) > >(wc -l|sed s/^/stdout:/) <<eof
set -$arg
for i in {0..9};do
echo $i
done
set +$arg
echo Done.
eof
sleep .02
done
- opts: x
stdout:11
stderr:21
- opts: v
stdout:11
stderr:4
- opts: n
stdout:0
stderr:0
- opts: nx
stdout:0
stderr:0
- opts: nv
stdout:0
stderr:5
- opts: nvx
stdout:0
stderr:5
কিছু ভেরিয়েবল পরীক্ষা করার জন্য, আমি এটি কিছু সময় ব্যবহার করি:
bash <(sed '18ideclare >&2 -p var1 var2' myscript.sh) args
যোগ করার জন্য:
declare >&2 -p var1 var2
18 লাইনে এবং চলমান ফলাফলের স্ক্রিপ্ট (সহ) এডিট না করে আরগস সহ )
অবশ্যই, এটি যোগ করার জন্য ব্যবহার করা যেতে পারে set [+-][nvx]
:
bash <(sed '18s/$/\ndeclare -p v1 v2 >\&2/;22s/^/set -x\n/;26s/^/set +x\n/' myscript) args
যোগ করবে declare -p v1 v2 >&2
লাইন 18 পরে, set -x
22 set +x
লাইনের আগে এবং 26 লাইনের আগে ।
bash <(sed '2,3s/$/\ndeclare -p LINENO i v2 >\&2/;5s/^/set -x\n/;7s/^/set +x\n/' <(
seq -f 'echo $@, $((i=%g))' 1 8)) arg1 arg2
arg1 arg2, 1
arg1 arg2, 2
declare -i LINENO="3"
declare -- i="2"
/dev/fd/63: line 3: declare: v2: not found
arg1 arg2, 3
declare -i LINENO="5"
declare -- i="3"
/dev/fd/63: line 5: declare: v2: not found
arg1 arg2, 4
+ echo arg1 arg2, 5
arg1 arg2, 5
+ echo arg1 arg2, 6
arg1 arg2, 6
+ set +x
arg1 arg2, 7
arg1 arg2, 8
দ্রষ্টব্য: সম্পর্কে যত্ন$LINENO
ফ্লাইটে পরিবর্তনগুলি দ্বারা প্রভাবিত হবে !
(ফলাফল নির্বাহের বাইরে স্ক্রিপ্ট দেখতে, কেবল ড্রপ করুন bash <(
এবং ) arg1 arg2
)
ব্যাশ স্ক্রিপ্টগুলি কীভাবে প্রোফাইল করবেন সে সম্পর্কে আমার উত্তরটি দেখুন
শেলের গ্লোবাল ভেরিয়েবলের মাধ্যমে শেল স্ক্রিপ্টগুলিতে লগ করার বিষয়ে বিশদ পরিমাণ রয়েছে। আমরা শেল স্ক্রিপ্টে একই ধরণের লগিং অনুকরণ করতে পারি: http://www.cubicrace.com/2016/03/log-tracing-mechnism-for-shell-scriptts.html
পোস্টটিতে INFO, DEBUG, ERROR এর মতো লগ স্তর প্রবর্তন সম্পর্কিত বিশদ রয়েছে। স্ক্রিপ্ট এন্ট্রি, স্ক্রিপ্ট প্রস্থান, ফাংশন এন্ট্রি, ফাংশন প্রস্থানের মতো বিশদ বিবরণ সন্ধান করা।
নমুনা লগ: