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


135

ব্যাশের কিছু স্ক্রিপ্ট নিয়ে ত্রুটি এবং অপ্রত্যাশিত আচরণ সম্পর্কে আমার কিছু সমস্যা হচ্ছে। আমি সমস্যার কারণগুলি তদন্ত করতে চাই যাতে আমি সংশোধনগুলি প্রয়োগ করতে পারি। আরও তথ্য পাওয়ার জন্য কি কোনও উপায় আছে যে আমি বাশের জন্য কোনও ধরণের "ডিবাগ-মোড" চালু করতে পারি?

উত্তর:


132

আপনার বাশ স্ক্রিপ্টটি শুরু করুন bash -x ./script.shবা আপনার স্ক্রিপ্টে set -xডিবাগ আউটপুট দেখতে যুক্ত করুন।


bash৪.১ বা তার পরে অতিরিক্ত :

আপনি যদি আলাদা কোনও ফাইলে ডিবাগ আউটপুট লিখতে চান তবে এটি আপনার স্ক্রিপ্টে যুক্ত করুন:

exec 5> debug_output.txt
BASH_XTRACEFD="5"

দেখুন: https://stackoverflow.com/a/25593226/3776858


আপনি যদি লাইন নম্বর দেখতে চান তবে এটি যুক্ত করুন:

PS4='$LINENO: '


যদি আপনার loggerকমান্ডে অ্যাক্সেস থাকে তবে আপনি টাইমস্ট্যাম্প, স্ক্রিপ্টের নাম এবং লাইন নম্বর সহ আপনার সিসলগের মাধ্যমে ডিবাগ আউটপুট লিখতে এটি ব্যবহার করতে পারেন:

#!/bin/bash

exec 5> >(logger -t $0)
BASH_XTRACEFD="5"
PS4='$LINENO: '
set -x

# Place your code here

আপনি বিকল্প ব্যবহার করতে পারেন -pএর loggerএকজন ব্যক্তি সুবিধা এবং স্তর নিজস্ব লগ ফাইল স্থানীয় syslog- র মাধ্যমে আউটপুট লিখতে সেট করতে কমান্ড।


7
-v এছাড়াও সাহায্য করতে পারে (প্রতিটি লাইন কার্যকর হওয়ার সাথে সাথে মুদ্রণ করে। এক্স-এর সাথে সংযুক্ত করা যায়)। এবং আরও দেখুন: bashdb.sourceforge.net
অলিভিয়ার ডুলাক

4
আর একটি দুর্দান্ত রিসোর্স হ'ল: শেলচেক.net
অলিভিয়ার ডুলাক

"এক্সিকিউট 5>" কি করে?
অ্যাগ্রসোল

3
@aggsol: আপনি ব্যবহার করেন তাহলে BASH_XTRACEFD="5"ট্রেস আউটপুট উত্পন্ন যখন লিখেছেন ব্যাশ set -xথেকে সক্রিয় করা হয় বর্ণনাকারী দায়ের 5. exec 5> >(logger -t $0)ফাইল বর্ণনাকারী 5 থেকে আউটপুট পুননির্দেশনা loggerকমান্ড।
সাইরাস

1
শুধু ভাবছি আপনি পিএস 4 এ লাইন নম্বর এবং শেল স্ক্রিপ্টের পথ বা নাম পেতে পারেন?
iloveretards

54

ব্যবহার set -x

আমি সবসময় ব্যবহার করি set -xএবং set +x। ভার্বোসিটিটি উপরে / নীচে পরিণত করতে আপনি তাদের সাথে কী ঘটছে তা আপনি দেখতে চান।

#!/bin/bash

set -x
..code to debug...
set +x

log4bash

এছাড়াও যদি আপনি বিকাশ কাজ করে থাকেন এবং লগ 4j, log4perl ইত্যাদি নামে লগারের স্টাইলের সাথে পরিচিত হন, তবে আপনি লগ 4 ব্যাশ ব্যবহার করতে চাইতে পারেন ।

উদ্ধৃতাংশ

আসুন এটির মুখোমুখি হন - সাধারণ পুরানো প্রতিধ্বনি কেবল এটি কাটেনি। লগ 4 ব্যাশ ব্যাশ স্ক্রিপ্টগুলির জন্য আরও ভাল লগিং করার একটি প্রচেষ্টা (যেমন বাশ-এ লগিং কম চুষিয়ে নিন)।

সেখান থেকে আপনি আপনার বাশ স্ক্রিপ্টগুলিতে এই জাতীয় জিনিসগুলি করতে পারেন:

#!/usr/bin/env bash
source log4bash.sh

log "This is regular log message... log and log_info do the same thing";

log_warning "Luke ... you turned off your targeting computer";
log_info "I have you now!";
log_success "You're all clear kid, now let's blow this thing and go home.";
log_error "One thing's for sure, we're all gonna be a lot thinner.";

# If you have figlet installed -- you'll see some big letters on the screen!
log_captains "What was in the captain's toilet?";

# If you have the "say" command (e.g. on a Mac)
log_speak "Resistance is futile";

এই ধরণের ফলাফলের ফলাফল:

    SS1

log4sh

আপনার যদি আরও বেশি পোর্টেবলের প্রয়োজন হয় তবে এটি আরও পুরোনো log4sh। এর মতো log4bashএখানে কাজ করে:


উবুন্টু, আমি আছে alias say="spd-say"আমার .bashrc, যা অনুকরণে sayঅন্যান্য ডিস্ট্রো বা OS X এর থেকে কমান্ড
Doorknob

1
ট্র্যাপ - ট্র্যাপ রিড ডিবাগের সাথে ব্যবহার করা হলে সেট-ভিএক্স একটি ভাল সংমিশ্রণ হবে। এটি আপনাকে লাইন ধরে রেখার ফলে এবং ফলাফলগুলি দেখতে দেয়
ম্যাগনাস মেলউইন

34

এখানে ব্যাশ ডিবাগার, বাশডবি রয়েছে যা অনেকগুলি ডিস্ট্রোতে ইনস্টলযোগ্য প্যাকেজ। এটি ব্যাশের অন্তর্নির্মিত বর্ধিত ডিবাগিং মোড ( shopt -s extdebug) ব্যবহার করে। দেখতে অনেকটা জিডিবির মতো; কিছু স্বাদ দিতে এখানে একটি নমুনা সেশন:

$ ls
1st.JPG  2ndJPG.JPG
$ cat ../foo.sh
for f in *.JPG
do
  newf=${f/JPG/jpg}
  mv $f $newf
done
$ bashdb ../foo.sh
(foo.sh:1):
1:      for f in *.JPG
bashdb<0> next
(foo.sh:3):
3:        newf=${f/JPG/jpg}
bashdb<1> next
(foo.sh:4):
4:        mv $f $newf

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

bashdb<2> print $f $newf
1st.JPG 1st.jpg
bashdb<3> next
(foo.sh:1):
1:      for f in *.JPG
bashdb<4> next
(foo.sh:3):
3:        newf=${f/JPG/jpg}
bashdb<5> next
(foo.sh:4):
4:        mv $f $newf
bashdb<6> print $f $newf
2ndJPG.JPG 2ndjpg.JPG

আমরা যা চাই তা নয়! আবার প্যারামিটার সম্প্রসারণ তাকান।

bashdb<7> print $f ${f/JPG/jpg}
2ndJPG.JPG 2ndjpg.JPG
bashdb<8> print $f ${f/JPG$/jpg}
2ndJPG.JPG 2ndJPG.JPG
bashdb<9> print $f ${f/%JPG/jpg}
2ndJPG.JPG 2ndJPG.jpg

ঠিক আছে, এটি কাজ করে। আসুন newfসঠিক মান সেট করা যাক ।

bashdb<10> eval newf=${f/%JPG/jpg}
$? is 0
bashdb<11> print $f $newf
2ndJPG.JPG 2ndJPG.jpg

ভাল লাগছে। স্ক্রিপ্ট চালিয়ে যান।

bashdb<12> next
Debugged program terminated normally. Use q to quit or R to restart.
$ ls
1st.jpg  2ndJPG.jpg

20

বর্ন-এর মতো বেশিরভাগ বোর্ন-ভিত্তিক শেলগুলিতে স্ক্রিপ্টগুলি ডিবাগ করার মানক পদ্ধতিটি হ'ল set -xআপনার স্ক্রিপ্টের শীর্ষে লেখা। এটি বাশ কী হবে / সম্পাদিত হচ্ছে এবং কীভাবে যুক্তি মূল্যায়ন করা হয় সে সম্পর্কে আরও ভার্জোজ তৈরি করবে।

-x  Print commands and their arguments as they are executed.

এটি উভয়ই দোভাষী বা ভিতরে স্ক্রিপ্টগুলির জন্য দরকারী। উদাহরণ স্বরূপ:

$ find "$fileloc" -type f -prune "$filename" -print
+ find /var/adm/logs/morelogs -type f -prune '-name *.user' -print
find: unknown predicate '-name *.user'
$ find "$fileloc" -type f -prune $filename -print
+ find /var/adm/logs/morelogs -type f -prune -name '*.user' -print
find: '/var/adm/logs/morelogs': No such file or directory

উপরের অংশে আমরা দেখতে পাচ্ছি কেন কিছু একক উদ্ধৃতির কারণে অনুসন্ধান ব্যর্থ হচ্ছে।

বৈশিষ্ট্যটি নিষ্ক্রিয় করতে, কেবল টাইপ করুন set +x


13

Eclipse ব্যবহার করে

আপনি নীচে লিঙ্কিত "_DEBUG.sh" স্ক্রিপ্টের সাথে Eclipse এবং Shelled এর সম্মিলিত পরিবেশ ব্যবহার করতে পারেন।

শেল স্যুইচিং

ডিফল্টরূপে শেলড উন্নয়ন সরঞ্জাম /bin/dashদোভাষী হিসাবে ব্যবহার করে। /bin/bashওয়েবে এবং আমার পরিবেশে বেশিরভাগ শেল উদাহরণের সাথে আরও ভাল সামঞ্জস্য রাখতে আমি এটিকে পরিবর্তন করেছি।

দ্রষ্টব্য: আপনি এটিকে পরিবর্তন করতে পারেন: উইন্ডো -> পছন্দ -> শেল স্ক্রিপ্ট -> দোভাষী

নির্দেশাবলী সেটআপ করুন

ডিবাগার প্যাকেজটিতে _DEBUG.shআপনার স্ক্রিপ্ট ডিবাগিংয়ের জন্য স্ক্রিপ্টটি ব্যবহারের পদক্ষেপ রয়েছে যা মূলত (রিডমি. টেক্সট):

  1. শেল স্ক্রিপ্ট প্রকল্প তৈরি করুন: ফাইল -> নতুন -> অন্যান্য -> শেল স্ক্রিপ্ট -> শেল স্ক্রিপ্ট প্রকল্প উইজার্ড
  2. বাশ স্ক্রিপ্ট ফাইল তৈরি করুন: ফাইল -> নতুন -> ফাইল । এই উদাহরণস্বরূপ, এটি হবে script.sh। এক্সটেনশনটি ".sh" হওয়া উচিত এবং এটি আবশ্যক।
  3. _DEBUG.shপ্রজেক্ট ফোল্ডারে ফাইলটি অনুলিপি করুন ।
  4. ফাইলের শীর্ষে নীচের পাঠ্যটি প্রবেশ করান script.sh:

    . _DEBUG.sh
  5. ফাইল মাইক্রোসফট উইন্ডোজ তৈরি হয়, তাহলে চালানো নিশ্চিত করা ফাইল > - রূপান্তর লাইন বিভেদক করতে -> ইউনিক্স

  6. একটি ডিবাগ প্রবর্তন কনফিগারেশন সেট আপ করুন: চালান -> ডিবাগ কনফিগারেশন -> বাশ স্ক্রিপ্ট ... এখানে 2 টি ক্ষেত্র সেট আছে:

    ক) "বাশ স্ক্রিপ্ট:" - ডিবাগ করার জন্য বাশ স্ক্রিপ্টের কর্মক্ষেত্রের পথের পথ।
    e) "ডিবাগার পোর্ট:" 33333

  7. ডিবাগের দৃষ্টিভঙ্গিতে স্যুইচ করুন। ডিবাগিং সেশন শুরু করুন। script.shবাশ শেল থেকে লঞ্চ করুন ।

ব্যাশ ডিবাগ ইউআই

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

এই ব্যাশ ডিবাগারে স্ট্যান্ডার্ড প্রোগ্রামিং ডিবাগারগুলির পুরো বৈশিষ্ট্য রয়েছে যেমন:

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

শেলড (শেল স্ক্রিপ্ট সম্পাদক) আইডিই (ইন্টিগ্রেটেড ডেভলপমেন্ট এনভায়রনমেন্ট) আপনার স্ক্রিপ্টটি লেখার সময় প্রসঙ্গ চেকিং, হাইলাইট এবং ইন্ডেন্টিংয়ের একটি অতিরিক্ত বোনাস পেয়েছে। যদি এটি সঠিকভাবে ইনডেন্ট না করে, আপনি অবিলম্বে সেখানে স্থানীয় অনেক ত্রুটি পতাকাঙ্কিত করতে / স্থানীয় করতে সক্ষম হতে পারেন।

তারপরে অন্যান্য আইডিই সুবিধা রয়েছে যেমন:

  • টুডো টাস্ক লিস্ট
  • মাইলিন টাস্ক
  • বুকমার্কের তালিকা
  • একাধিক উইন্ডো সম্পাদনা
  • পরিবেশের দূরবর্তী ভাগ করে নেওয়া

কুল টিপ। জেনে ভালো লাগল যে বাশকে এভাবে ডিবাগ করা যায়।
slm

8

সাম্প্রতিক বছরগুলিতে একটি দুর্দান্ত সংস্থান হাজির হয়েছে: http://shellcheck.net

এটি আপনাকে নিয়মিত বাশের চেয়ে আরও বেশি কিছু দেখায়, যার ফলে সহজেই সেইসব সমস্যাযুক্ত আনলসড কোট বা কোঁকড়ানো বন্ধনী ইত্যাদির সন্ধান পাওয়া যায় etc.

আপনি নিশ্চিত করুন যে আপনি সংবেদনশীল ইনফোগুলি (আইপিএস, পাসওয়ার্ড, ইত্যাদি) নেটে পেস্ট করবেন না ... (বিশেষত এটি HT, এনক্রিপ্ট করা না থাকায়) (আমি বিশ্বাস করি যে শেলচেক ডাউনলোড করার জন্য উপলব্ধ, তবে আমি নিশ্চিত নই)


6

আজকাল, ভিএস কোড ব্যাশ ডিবাগ রয়েছে।

https://marketplace.visualstudio.com/items?itemName=rogalmic.bash-debug

এটিতে 'স্টেপ ইন / আউট / আউট' রয়েছে এবং প্রতিটি ভেরিয়েবলের মানও দেখায়।

ভিএস কোড ব্যাশ ডিবাগ স্ক্রিনশট


এই উত্তরটি সঠিক প্রসঙ্গে প্রশ্নের সমাধান করে না; আইডিই উল্লেখ না
করায়

5

সহজভাবে ব্যবহার করুন:

#!/bin/bash -x

শেলের জন্য একই:

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