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


31

প্রতিধ্বনি এবং লগিং ব্যবহার না করে বাশ স্ক্রিপ্ট ডিবাগ করার কোনও উপায় আছে কি?

আমি ব্রেকপয়েন্ট এবং এর মতো স্টাফ ব্যবহার করার কথা বলছি।

উত্তর:



20

বিভিন্ন উপায় আছে, যেমন:

  • -X বিকল্পের সাহায্যে আপনার স্ক্রিপ্টটি চালান

    bash -x yourscript.sh
  • যোগ set -xকুঁড়েঘর পরে আপনার স্ক্রিপ্ট শুরুতে একটি নতুন লাইন #!/bin/bashএবং আপনার স্ক্রিপ্টের শুরুর আগে, set -vশেল ইনপুট লাইন, নিজেদের প্রদর্শন করবে set -xপ্রদর্শন মৃত্যুদন্ড কার্যকর কমান্ড এবং আর্গুমেন্ট

  • এর সাথে আপনার স্ক্রিপ্ট ফাইলের শেবাং প্রতিস্থাপন করুন #!/bin/bash -xv




4

"কনসোল" এ নেমে আপনি এই ছোট ফাংশনটি ব্যবহার করতে পারেন:

function debug
{
    echo "#############|  Entering DEBUG mode  |####################";
    cmd=""
    while [[ $cmd != "exit" ]]; do
        read -p "> " cmd
        case "$cmd" in
            vars ) ( set -o posix ; set );;
            exit ) ;;
            * ) eval "$cmd";;
        esac
    done
    echo "#############|  End of DEBUG mode |####################";
}

তারপরে, আপনার স্ক্রিপ্টের অভ্যন্তরে (উদাহরণ):

for file in *; do
...
   if [[ $file == "strange_case.txt" ]]; then
       # break the code here to analyze:
       debug
   fi
...
done

এটি স্থানীয় ভেরিয়েবল অক্ষত রেখে যে কোনও কমান্ড গ্রহণ করবে। "ডিবাগ" মোডে প্রস্থান করতে, "প্রস্থান" টাইপ করুন (এটি স্ক্রিপ্ট থেকে প্রস্থান করবে না) এবং এটি কোড সহ চালিয়ে যাবে। আপনি যদি কোনও লুপের ভিতরে "ডিবাগ" ব্যবহার করেন তবে এটি প্রতিবার বন্ধ হয়ে যাবে। আপনি এটিকে "যদি" (উপরের উদাহরণের মতো) এর মধ্যে গুটিয়ে রাখতে পারেন, বা একটি "ঘড়ি" ফাংশন তৈরি করতে পারেন:

function debug_watch
{
    if [[ $1 == $2 ]]; then
        debug
    fi
}

# And Use it:

debug_watch "$file" "strange_case.txt"

আমি "ভার্সন" কমান্ডও যুক্ত করেছি যা সমস্ত উপলব্ধ ভেরিয়েবল এবং তাদের মানগুলিকে ডাম্প করবে। আপনি নিজের কাস্টমাইজড কমান্ডগুলিও যুক্ত করতে পারেন।

আমি কয়েক মিনিটের মধ্যে কোডটি করেছি তাই এটি আপনার নিজের ঝুঁকিতে ব্যবহার করুন। সচেতন থাকুন যে ডিবাগ মোডে যে কোনও কমান্ড কার্যকর করা যেতে পারে, সুতরাং এটি আপনি কোনও প্রোডাক্ট স্ক্রিপ্টে রেখে দিলে এটি একটি সুরক্ষা ঝুঁকি তৈরি করে।


3
বড় হাতের অক্ষরের নাম ব্যবহার করা এড়িয়ে চলুন। আপনার ঝুঁকি বিশেষ শেল ভেরিয়েবল এবং পরিবেশের ভেরিয়েবলগুলিকে ওভাররাইড করে। এছাড়াও, নিশ্চিত হয়ে নিন যে ফলাফলের ক্ষেত্রে শব্দ বিভাজন এবং পথের নাম প্রসারণ এড়াতে আপনি যখন প্যারামিটারের বিস্তৃতিগুলি তর্ক হিসাবে ব্যবহার করেন তখন তা উদ্ধৃত করেছেন। যেমন * ) eval "$cmd" ;;এবং debug_watch "$file" strange_case.txt
গিরিহা

গিরির পরামর্শ অনুসারে সম্পাদিত কোড।
Lepe

2

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

set -xপতাকা সেট করতে পারেন হবে এবং সেট না পারেন টার্মিনাল থেকে, বা আপনার স্ক্রিপ্ট থেকে। ব্যবহার +বা -:

#!/bin/bash
#fileinfo
ls -l $1
set -x      # start debugging here
wc -l $1
set +x      # stop debugging here
file $1
set -v      # start verbose output
w | more    
echo ""
echo -n "Number of users: "
set +v      # end verbose output
who | wc -l

setকমান্ডগুলি এখানে যা করে :

  • set -f মেটাচার্যাক্টর ব্যবহার করে ফাইলের নাম উত্পাদন নিষ্ক্রিয় করুন।
  • set -v (ভার্বোস) শেল ইনপুট লাইনগুলি পড়ার সাথে সাথে প্রিন্ট করে।
  • set -x কমান্ড কার্যকর করার আগে মুদ্রণ কমান্ড ট্রেস করে।

setবাস্তবে অনেকগুলি বৈশিষ্ট্য রয়েছে তবে দুর্ভাগ্যক্রমে কোনও ম্যান পৃষ্ঠা নেই কারণ এটি সরঞ্জামটিতে নির্মিত শেল। সেটটির জন্য ম্যানুয়ালটি জিএনইউ বাশ ডকুমেন্টেশনে রয়েছে

এমন অনেক কমান্ড লাইনের সরঞ্জাম রয়েছে যা আপনাকে আপনার প্রোগ্রাম সম্পর্কে বিশদ অর্জনে সহায়তা করতে পারে যেমন:

  • stat ফাইল বা ফাইল সিস্টেমের স্থিতি প্রদর্শন করুন
  • file একটি ফাইল টাইপ নির্ধারণ করুন।
  • hexdump ফিল্টার যা বিভিন্ন ফর্ম্যাটে নির্দিষ্ট ফাইলগুলি প্রদর্শন করে
  • nohup একটি স্ক্রিপ্ট চালান যা স্থির হবে না

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

কী কমান্ডটি ctrl\একটি চলমান প্রোগ্রাম বা স্ক্রিপ্টকে কোর ডাম্পের কারণ করে। তারপরে আপনি কর্ডাম্প বিশ্লেষণ করতে পারেন। আমি সম্ভবত একটি কোরেডাম্প বিশ্লেষণ করতে জিডিবি ব্যবহার করব তবে তার জন্য অনেকগুলি প্রোগ্রাম বিদ্যমান।

ব্যাশ শেলের ডিবাগিংয়ের জন্য কিছু নিফটি বিকল্প রয়েছে। আপনাকে সহায়তা করার জন্য বিকল্পগুলি --debugger, -vভার্বোজ --dump-stringsএবং অন্যান্য নিফটি বিকল্পগুলি। তাদের ব্যবহার করে দেখুন man bash

trapকমান্ড (সালে নির্মিত শেল) আপনার জন্য খুবই সহায়ক হতে পারে। ফাঁদ বলে যদি আপনার প্রোগ্রামটি অপ্রত্যাশিতভাবে প্রস্থান করে, কিছু কার্যকর করুন। আপনি অন্যান্য কুশলী ব্যাশ শেল builtins ফাঁদ সম্পর্কে পড়ুন, এবং এখানে

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

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


1

ব্যাশ স্ক্রিপ্ট ডিবাগ করার জন্য একটি জিইউআই বিকল্প হ'ল বাশEclipse / শেলড প্লাগইন সহ Eclipse IDE।

এটি breakpoints and stuffজটিল বাশ স্ক্রিপ্টগুলি ডিবাগ করার জন্য অন্যান্য বৈশিষ্ট্যগুলির হোস্টের সাথে আপনার প্রশ্নের বৈশিষ্ট্যগুলি ( ) সরবরাহ করে।

বৈশিষ্ট্যগুলির মধ্যে কিছু রয়েছে:
( https://unix.stackexchange.com/questions/155551/how-to-debug-a-bash-script )

  • ব্রেক পয়েন্ট টগল করুন
  • একক ধাপে পদক্ষেপ অপারেশন
  • স্টেপ-ইন, স্টেপ-আউট, স্টেপ-ওভার ফাংশন এবং উপ-রুটিন
  • স্ক্রিপ্ট চলাকালীন যে কোনও সময়ে কোড ভেরিয়েবল পরীক্ষা করা
  • টুডো টাস্ক লিস্ট
  • বুকমার্কের তালিকা
  • একাধিক উইন্ডো সম্পাদনা
  • প্রকল্পের পরিবেশের দূরবর্তী ভাগ করে নেওয়া

স্ক্রিপ্ট সম্পাদক দৃষ্টিভঙ্গি: অ্যাকলিপস স্ক্রিপ্ট আইডিই

ডিবাগিং দৃষ্টিকোণ: গ্রহন স্ক্রিপ্ট ডিবাগের দৃষ্টিভঙ্গি

ব্যবহার করার জন্য পদক্ষেপ যোগ হয় Shelledএবং BashEclipseগ্রাস pluggins। তারপরে ডিবেগার শুরু করার জন্য আমাকে পাঠ্য ফাইলটি পড়ুন বাশএক্লিপসে প্রদত্ত পদ্ধতিটি চালান।

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