কীভাবে বাশ স্ক্রিপ্ট ডিবাগ করবেন? [বন্ধ]


159

কোনও বাশ স্ক্রিপ্ট ডিবাগ করার কোনও উপায় আছে? উদাহরণস্বরূপ এমন কিছু যা "কলিং লাইন 1", "কলিং লাইন 2" ইত্যাদির মতো একজাতীয় লগ প্রিন্ট করে etc.


2
এখানে একটি অনুরূপ প্রশ্ন রয়েছে: serverfault.com/questions/16204/…
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত

উত্তর:


195
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বিকল্পটির সাথে শেবাং লাইনে নাম করা শেলটি ব্যবহার করা বুদ্ধিমান এবং বুদ্ধিমান - প্রয়োজনীয় এমনকি - হবে । অন্যথায়, আপনি স্ক্রিপ্টটি চলাকালীন ডিবাগ করার সময় (করবে?) আলাদা আচরণ পেতে পারেন।


1
তিনি একটি bashস্ক্রিপ্ট নির্দিষ্ট করেছেন । এবং এর সাথে ব্যাশ স্ক্রিপ্ট চালানো sh -xএকে সম্পূর্ণ আলাদা আচরণের কারণ করবে! আপনার উত্তর আপডেট করুন।
লুুনাথ

1
@ লুনাথ: কীভাবে 'শ-এক্স' (বা 'বাশ-এক্স') কোনও স্ক্রিপ্টকে সম্পূর্ণ আলাদা আচরণ করে? স্পষ্টতই, এটি স্ট্যাডারকে ট্রেস তথ্য আউটপুট করে; এটি একটি প্রদত্ত (যদিও আমার উত্তরে উল্লেখ করা হয়নি)। তবে আর কি? আমি লিনাক্স এবং ম্যাকোস এক্স-তে 'বাশ' হিসাবে 'শ' হিসাবে ব্যবহার করি এবং কোনও গুরুতর সমস্যা লক্ষ্য করি না।
জোনাথন লেফলার

6
স্টার্টআপ এবং রানটাইমের অধীনে পার্থক্য রয়েছে। তারা ব্যাশ বিতরণে সম্পূর্ণ নথিভুক্ত're
দ্য বনসাই

4
এখানে বাশ ডকটির একটি লিঙ্ক রয়েছে: gnu.org/software/bash/manual/bashref.html#Bash- স্টার্টআপ- ফাইলস ' বাশকে sh নামের সাথে যুক্ত করা হলে এটি sh এর historical তিহাসিক সংস্করণগুলির সূচনা আচরণের নকল করার চেষ্টা করে
যথাযথভাবে

6
এবং আরও কার্যকর তথ্য দেওয়ার জন্য PS4 প্রম্পটটি ব্যবহার করুন:export PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'
এস্তানি

28

আমি আমার স্ক্রিপ্টটি ডিবাগ করার জন্য নিম্নলিখিত পদ্ধতিগুলি ব্যবহার করেছি।

set -eকোনও বাহ্যিক প্রোগ্রাম যদি শূন্য-বহির্গমন স্থিতি ফিরে দেয় তবে স্ক্রিপ্টটি তত্ক্ষণাত বন্ধ করে দেয়। আপনার স্ক্রিপ্টটি যদি ত্রুটিযুক্ত সমস্ত ক্ষেত্রে পরিচালনা করার চেষ্টা করে এবং যেখানে এটি করতে ব্যর্থতা আটকে থাকে তবে এটি কার্যকর।

set -x উপরে উল্লিখিত ছিল এবং অবশ্যই সমস্ত ডিবাগিং পদ্ধতিগুলির মধ্যে সবচেয়ে দরকারী।

set -n আপনি যদি সিন্টেক্স ত্রুটির জন্য আপনার স্ক্রিপ্টটি পরীক্ষা করতে চান তবে এটি কার্যকরও হতে পারে।

straceকী চলছে তা দেখতেও দরকারী। বিশেষত দরকারী যদি আপনি নিজে স্ক্রিপ্টটি না লিখে থাকেন।


1
একটি স্ক্রিপ্ট স্ট্র্যাকিং (অর্থাত্ স্ক্রিপ্টটি কার্যকর শেলটিকে স্ট্রাক করা) একটি অদ্ভুত শেল ডিবাগিং পদ্ধতি (তবে সীমিত ইস্যুগুলির জন্য কাজ করতে পারে)।
দ্য বনসাই

1
আমি স্বীকার করি এটি অদ্ভুত এবং খুব ভার্বোজ, তবে আপনি যদি স্ট্রেসের আউটপুটকে কয়েকটি সিস্টেমে সীমাবদ্ধ করেন তবে এটি কার্যকর হয়ে যায়।

1
strace -fআপনি যদি স্ক্রিপ্ট দ্বারা শুরু হওয়া প্রক্রিয়াগুলিতে ত্রুটিও খুঁজে পেতে চান তবে সেই নোটটি প্রয়োজনীয়। (এটি এটিকে বহুগুণ ভার্বোজের করে তোলে তবে আপনি যদি এটি আগ্রহী সেই সিস্টেমে সীমাবদ্ধ রাখেন তবে এখনও দরকারী)।
র্যান্ডম 832


12

এই উত্তরটি বৈধ এবং দরকারী: https://stackoverflow.com/a/951352

তবে, আমি দেখতে পেয়েছি যে "স্ট্যান্ডার্ড" স্ক্রিপ্ট ডিবাগিং পদ্ধতিগুলি অদক্ষ, অজ্ঞাতনামা এবং ব্যবহার করা শক্ত। অত্যাধুনিক জিইউআই ডিবাগারগুলির জন্য যাঁরা সবকিছু আপনার নখদর্পণে রেখেছেন এবং কাজটিকে সহজ সমস্যার (এবং কঠিন সমস্যার পক্ষে সম্ভব) জন্য একটি হাওয়া বানাচ্ছে তাদের জন্য, এই সমাধানগুলি খুব সন্তোষজনক নয়।

আমি যা করি তা হ'ল ডিডিডি এবং বাশদ্বির সংমিশ্রণটি ব্যবহার করা। পূর্ববর্তীটি পরবর্তীকর্ম সম্পাদন করে এবং দ্বিতীয়টি আপনার স্ক্রিপ্টটি কার্যকর করে। এটি আপনার মাথায় প্রসঙ্গ বজায় রাখার জন্য ধ্রুব মানসিক প্রয়াস ছাড়াই বা উত্সটিকে পুনরায় তালিকাভুক্ত রাখার প্রসঙ্গে কোডের মধ্য দিয়ে পদক্ষেপ গ্রহণের এবং ভেরিয়েবলগুলি, স্ট্যাক ইত্যাদির দেখার ক্ষমতা সহ একাধিক উইন্ডো ইউআই সরবরাহ করে।

এটি সেট আপ করার বিষয়ে এখানে গাইডেন্স রয়েছে: http://ubuntuforums.org/showthread.php?t=660223


আপনার উত্তরের জন্য সদ্য ddd আবিষ্কার করেছি। উবুন্টু 12.04.3 (64 বিট) এ, অ্যাপ-উত্স সংস্করণ কাজ করে না। আমার বাশ স্ক্রিপ্টটি ডিবাগ করা শুরু করতে আমাকে উত্স থেকে সংকলন এবং ইনস্টল করতে হয়েছিল। এখানে নির্দেশাবলী - Askubuntu.com / প্রশ্নগুলি / 156906/… সহায়তা করেছে।
ক্রোনোডেকার

হ্যাঁ, এটি একটি সমস্যা। কিছু সময় আগে আমি এটিকে কিছু স্ক্রিপ্টিং দিয়ে সমাধান করেছি - 'dddbash' DDD ইনস্টল / বিল্ড করে, পুরানো সংস্করণটি ভুল হলে তা সরায়, বাশদ্বি ইনস্টল করে etc. ইত্যাদি (উত্তর এখন এই তথ্য দিয়ে সম্পাদিত হয়েছে)
স্টেলেডোগ

10

আপনি স্ক্রিপ্টের মধ্যে "সেট-এক্স "ও লিখতে পারেন।


4
এবং আপনি এটি সেট করতে 'সেট + এক্স' লিখতে পারেন।
জোনাথন লেফলার

10

আমি শেলচেক ইউটিলিটিটি পেয়েছি এবং কিছু লোকেরা এটি আকর্ষণীয় বলে মনে হতে পারে 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

এখন খুঁজুন!

এটি একটি ছোট উদাহরণ।



ভাগ্যক্রমে হাতিয়ারটি সেই স্থানে বিকশিত হয়েছে যেখানে এটি বাকী বাগটিও খুঁজে পায় finds
ট্রিপলি

3

ভিএসকোড ইনস্টল করুন , তারপরে ব্যাশ ডিবাগ এক্সটেনশান যুক্ত করুন এবং আপনি ভিজ্যুয়াল মোডে ডিবাগ করার জন্য প্রস্তুত। কর্মক্ষেত্রে এখানে দেখুন ।

এখানে চিত্র বর্ণনা লিখুন


3

প্লাগইনগুলি শেলড এবং বাশেক্লিপসে গ্রহটি ব্যবহার করুন।

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 এ অনেক স্ক্রিনশট সহ একটি টিউটোরিয়াল লিখেছিলাম


2
এটি সীমান্তের লিংক-কেবল উত্তর (এটিও এখানে দেখুন )। এখানে যতটা সম্ভব তথ্য অন্তর্ভুক্ত করার জন্য আপনার উত্তরটি প্রসারিত করা উচিত, আপনি যা পরামর্শ দিচ্ছেন তা বাস্তবায়নের জন্য কমপক্ষে ন্যূনতম প্রয়োজনীয় প্রয়োজন এবং লিঙ্কগুলি কেবলমাত্র রেফারেন্সের জন্য ব্যবহার করুন। মূলত, স্ট্যাক ওভারফ্লো (এবং সমস্ত স্ট্যাক এক্সচেঞ্জ) এর পোস্টগুলি অবশ্যই স্বয়ংসম্পূর্ণ থাকতে হবে। এর অর্থ হ'ল আপনার উত্তরে পর্যাপ্ত তথ্য থাকা দরকার যাতে পাঠকের দিকনির্দেশের জন্য অফ-সাইট যেতে হবে না । এই মুহুর্তে, এই উত্তরের ক্ষেত্রে এটি হয় না।
মাকেন

এটি অনেকের দিকে তাকানোর পরে আমি প্রথম উত্তর পেয়েছি যা প্রকৃতপক্ষে প্রমাণ করে যে সত্য ডিবাগ করা সম্ভব। মানক উত্তরগুলি "সেট + এক্স" পুরোপুরি একটি স্ব-অন্তর্ভুক্ত উত্তরের সাথে মেলে তবে প্রায় ইচ্ছাকৃতভাবে সত্য ডিবাগিং সম্পর্কিত সত্য প্রশ্নগুলি উপেক্ষা করে। আমি এই উত্তরটির প্রশংসা করি
sim

2

আমি একটি ব্যাশ ডিবাগার তৈরি করেছি। শুধু এটা ব্যবহার করে দেখুন। আমি আশা করি এটি https://sourceforge.net/projects/bashdebugingbash সহায়তা করবে


বিডিবি বর্তমানে ইংরেজি এবং স্প্যানিশ ভাষায় সমর্থিত। ভাষা পরিবর্তন করতে, ফাইল সম্পাদনা করুন / ইত্যাদি / ডিফল্ট / বিডিবি
আবাদজম

স্ক্রিনশটটি আকর্ষণীয় দেখায় তবে আমি এটি "বিডিবি.শ: লাইন 32: বিডিবিএসটিআর [1]: আনবাউন্ড ভেরিয়েবল" চালাতে পারি না; বিটিডব্লু কি কোডে প্রতিটি পদক্ষেপে সেট সেট ভেরিয়েবলের বর্তমান মানগুলি দেখায়?
কুম্ভ শক্তি

2

সেট + x = @ECHO অফ, সেট -x = @ECHO চালু।


আপনি -xvনীচে স্ট্যান্ডার্ড শেবাংয়ের বিকল্প যুক্ত করতে পারেন :

#!/bin/bash -xv  

-x: কার্যকর করার সাথে সাথে কমান্ড এবং তাদের যুক্তি প্রদর্শন করুন।
-v: শেল ইনপুট লাইনগুলি পড়ার সাথে প্রদর্শন করুন।


ltraceএর মতো অন্য লিনাক্স ইউটিলিটি strace। তবে, ltraceএক্সিকিউটেবল বা একটি চলমান প্রক্রিয়াতে কল করা সমস্ত লাইব্রেরি কলকে তালিকাবদ্ধ করে। এটির নামটি নিজেই লাইব্রেরি-কল ট্রেসিং থেকে আসে। উদাহরণ স্বরূপ:

ltrace ./executable <parameters>  
ltrace -p <PID>  

উৎস


1

আমি মনে করি আপনি এই ব্যাশ ডিবাগারটি চেষ্টা করতে পারেন: http://bashdb.sourceforge.net/


শেলের গ্লোবাল ভেরিয়েবলের মাধ্যমে শেল স্ক্রিপ্টগুলিতে লগ করার বিষয়ে বিশদ পরিমাণ রয়েছে। আমরা শেল স্ক্রিপ্টে একই ধরণের লগিং অনুকরণ করতে পারি: cubicrace.com/2016/03/effic-logging-mechnism-in- Shell.html
পিয়ুশ চর্ডিয়া

1

ডিবাগ করার জন্য কিছু কৌশল স্ক্রিপ্ট:

ব্যবহার 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 -x22 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)

ধাপে ধাপে, কার্যকর করার সময়

ব্যাশ স্ক্রিপ্টগুলি কীভাবে প্রোফাইল করবেন সে সম্পর্কে আমার উত্তরটি দেখুন


0

শেলের গ্লোবাল ভেরিয়েবলের মাধ্যমে শেল স্ক্রিপ্টগুলিতে লগ করার বিষয়ে বিশদ পরিমাণ রয়েছে। আমরা শেল স্ক্রিপ্টে একই ধরণের লগিং অনুকরণ করতে পারি: http://www.cubicrace.com/2016/03/log-tracing-mechnism-for-shell-scriptts.html

পোস্টটিতে INFO, DEBUG, ERROR এর মতো লগ স্তর প্রবর্তন সম্পর্কিত বিশদ রয়েছে। স্ক্রিপ্ট এন্ট্রি, স্ক্রিপ্ট প্রস্থান, ফাংশন এন্ট্রি, ফাংশন প্রস্থানের মতো বিশদ বিবরণ সন্ধান করা।

নমুনা লগ:

এখানে চিত্র বর্ণনা লিখুন

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