कैसे बैश स्क्रिप्ट को डीबग करें?


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"

मैंने "var" कमांड भी जोड़ा जो सभी उपलब्ध चर और उनके मूल्यों को डंप कर देगा। आप अपनी खुद की अनुकूलित कमांड भी जोड़ सकते हैं।

मैंने कुछ ही मिनटों में कोड किया था इसलिए इसे अपने जोखिम के तहत उपयोग करें। ध्यान रखें कि डिबग मोड में किसी भी कमांड को निष्पादित किया जा सकता है, इसलिए यदि आप इसे प्रोडक्शन स्क्रिप्ट में छोड़ते हैं तो यह सुरक्षा जोखिम पैदा करता है।


3
अपरकेस चर नाम का उपयोग करने से बचें। आपका जोखिम विशेष शेल चर और पर्यावरण चर को ओवरराइड करता है। इसके अलावा, सुनिश्चित करें कि जब आप तर्क-वितर्क के रूप में उपयोग किए जाते हैं, तो शब्द-विभाजन और पथ-विस्तार विस्तार से बचने के लिए आप पैरामीटर विस्तार को उद्धृत करते हैं। जैसे * ) eval "$cmd" ;;और debug_watch "$file" strange_case.txt
जिरह

भूरा द्वारा सुझाए अनुसार संपादित कोड।
4

2

NES क्या कह रहा है की धुन पर डिबगिंग की अनुमति देने के लिए बैश में झंडे लगाए जाते हैं।

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वास्तव में कई विशेषताएं हैं, लेकिन शोकजनक रूप से कोई भी आदमी पृष्ठ नहीं है क्योंकि यह उपकरण में निर्मित एक शेल है। सेट के लिए मैनुअल GNU बैश डॉक्यूमेंटेशन में है

कई कमांड लाइन उपकरण हैं जो आपके कार्यक्रम के बारे में विवरण प्राप्त करने में आपकी मदद कर सकते हैं जैसे:

  • stat प्रदर्शन फ़ाइल या फ़ाइल सिस्टम स्थिति
  • file एक फ़ाइल प्रकार निर्धारित करें।
  • hexdump फ़िल्टर जो विभिन्न स्वरूपों में निर्दिष्ट फ़ाइलों को प्रदर्शित करता है
  • nohup एक स्क्रिप्ट चलाएं जो लटकी न हो

    और कई अन्य। मैं उस आदेश के बारे में सोचने की कोशिश कर रहा था जो छिपे हुए पात्रों को दिखाता है, लेकिन मैं अभी ऐसा नहीं कर सकता। हेक्सडम्प इसे करेगा लेकिन एक बेहतर है।

मुख्य कमांड ctrl\कोर डंप के लिए एक रनिंग प्रोग्राम या स्क्रिप्ट का कारण होगा। तो फिर आप coredump का विश्लेषण कर सकते हैं। मैं शायद एक coredump का विश्लेषण करने के लिए gdb का उपयोग करूंगा, लेकिन उसके लिए कई कार्यक्रम मौजूद हैं।

बैश शेल में डिबगिंग के लिए कुछ निफ्टी विकल्प भी हैं। विकल्प --debugger, -vक्रिया, --dump-stringsऔर अन्य निफ्टी विकल्प आपकी सहायता के लिए। उनका उपयोग करके देखें man bash

trapआदेश (में बनाया शेल) आप के लिए बहुत उपयोगी हो सकता है। ट्रैप का कहना है कि यदि आपका प्रोग्राम अप्रत्याशित रूप से बाहर निकलता है, तो कुछ निष्पादित करें। आप जाल के बारे में पढ़ते हैं, और अन्य आसान बैश शैल निर्माण यहाँ हैं

फिलहाल आम तौर पर बोलना, डिबगिंग किसी भी भाषा में एक बहुत बड़ा विषय है। कुछ अन्य विषय जो किसी भी प्रोग्रामिंग भाषा में डिबगिंग के लिए आसान हो सकते हैं, में शामिल हैं, शेल पुनर्निर्देशन और, सिग्नल प्रोसेसिंग।

अंत में, मुझे लगता है कि मैंने जो उदाहरण इस्तेमाल किया है वह तुच्छ है, लेकिन यह है कि कुछ शेल स्क्रिप्ट सैकड़ों लाइनें हो सकती हैं। उन स्थितियों में, मैं या तो टिप्पणियां टैग सम्मिलित करना चाहता हूं और मुझे संदेह है कि कोड गलत है, या वैकल्पिक रूप से ब्लॉक करें, एक एक्जिट कमांड डालें, और फूट कोड से कार्यात्मक कोड को अलग करने का प्रयास करें, एक फूट डालो और जीतो तकनीक का उपयोग करें।


1

एक बैश स्क्रिप्ट डिबग करने के लिए GUI विकल्प बैशलेक / शेल्ड प्लगिन्स के साथ ग्रहण आईडीई है।

यह आपके प्रश्न ( breakpoints and stuff) की सुविधाओं के साथ-साथ जटिल बैश स्क्रिप्ट डिबगिंग के लिए अन्य सुविधाओं की मेजबानी भी देता है।

कुछ विशेषताओं में शामिल हैं:
( https://unix.stackexchange.com/questions/155551/how-to-debug-a-bash-script )

  • ब्रेक प्वाइंट टॉगल
  • एकल चरण-दर-चरण ऑपरेशन
  • स्टेप-इन, स्टेप-आउट, स्टेप-ओवर फ़ंक्शन और उप-रूटीन
  • स्क्रिप्ट चलने के दौरान किसी भी बिंदु पर कोड चर की जांच करना
  • TODO कार्य सूची
  • बुकमार्क सूची
  • एकाधिक विंडो संपादन
  • परियोजना के वातावरण का रिमोट शेयरिंग

स्क्रिप्ट संपादक परिप्रेक्ष्य: ग्रहण स्क्रिप्ट आईडीई

डिबगिंग परिप्रेक्ष्य: ग्रहण स्क्रिप्ट डीबग परिप्रेक्ष्य

उपयोग करने के लिए चरण Shelledऔर BashEclipseप्लगइन्स को ग्रहण में जोड़ना है । फिर डिबगर शुरू करने के लिए BashEclipse में दी गई प्रक्रिया को मुझे पाठ फ़ाइल पढ़ें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.