2012-01-31 12 views
63

अगर मैं bash -x विकल्प दर्ज करता हूं, तो यह सभी लाइन दिखाएगा। लेकिन लिपि मानक आदर्श निष्पादित करेगा।लाइन द्वारा बैश स्क्रिप्ट लाइन को कैसे निष्पादित करें?

मैं लाइन से लाइन कैसे निष्पादित कर सकता हूं? मैं देख सकता हूं कि यह सही चीज करता है, या मैं बग को रोकता हूं और ठीक करता हूं। एक ही प्रभाव प्रत्येक पंक्ति में read डाल दिया जाता है।

+0

शायद अधिक मोटे तौर पर भी https://stackoverflow.com/questions/951336/how-to-debug-a-bash-script/45096876#45096876 – tripleee

उत्तर

87

आपको प्रत्येक पंक्ति में पढ़ने की आवश्यकता नहीं है, बस अपनी बैश स्क्रिप्ट में निम्न जैसे एक जाल जोड़ें, इसका प्रभाव आप चाहते हैं, उदाहरण के लिए।

#!/usr/bin/env bash 
set -x 
trap read debug 

< YOUR CODE HERE > 

काम करता है, बस बैश v4.2.8 और v3.2.25 के साथ यह परीक्षण किया गया।


उन्नत संस्करण

अपनी स्क्रिप्ट फ़ाइलों से सामग्री पढ़ने जाता है, तो ऊपर सूचीबद्ध काम नहीं करेगा। एक उदाहरण निम्नलिखित उदाहरण की तरह दिख सकता है।

#!/usr/bin/env bash 
echo "Press CTRL+C to proceed." 
trap "pkill -f 'sleep 1h'" INT 
trap "set +x ; sleep 1h ; set -x" DEBUG 

< YOUR CODE HERE > 

रोकने के लिए स्क्रिप्ट आप करना होगा इस मामले में एक अन्य सुरक्षा से मार डालते हैं।


ALTERNATIVE1

आप बस निम्न उदाहरण अपनी स्क्रिप्ट में अगले आदेश के लिए आगे बढ़ने के लिए काम कर सकता से पहले कुछ सेकंड प्रतीक्षा करने के लिए चाहते हैं।

#!/usr/bin/env bash 
trap "set +x; sleep 5; set -x" DEBUG 

< YOUR CODE HERE > 

मैं आउटपुट को और अधिक पठनीय बनाने के लिए जाल कमांड के भीतर सेट + एक्स और सेट-एक्स जोड़ रहा हूं।

+1

फिर आप अगली पंक्ति पर कैसे जाते हैं (अगली कमांड चलाएं)? –

+2

यह प्रत्येक आदेश पर एक पठन जाल।केवल एक चीज जो आपको करने की ज़रूरत है वह अगली कमांड –

+0

पर पहुंचने के लिए वापसी दबा रही है, यदि कोई अन्य शेल का उपयोग करना पसंद करता है तो भी ksh के साथ काम करता है। – ChrisGer

10

शायद BASH Debugger आपके लिए कुछ है।

+1

देखना यह वास्तव में सबसे अच्छा समाधान है। यह लाइन चलाने से पहले लाइन को देखने की अनुमति देता है (और बहुत कुछ)। अधिकांश प्रणालियों पर इसे 'apt-get install bashdb' के साथ स्थापित किया जा सकता है। फिर आपको बस 'bashdb your_command.sh' चलाने की आवश्यकता है,' step' टाइप करें, और उसके बाद कैरिज रिटर्न हिट करें। – studgeek

+0

@ स्टूडगेक यह रेडहाट/सेंटोस आदि पर उपलब्ध नहीं है, इसलिए मैं इसे "अधिकांश सिस्टम" नहीं कहूंगा। – Sajuuk

0

यदि आपकी बैश स्क्रिप्ट वास्तव में एक ऑफ कमांड का एक गुच्छा है जिसे आप एक-एक करके चलाने के लिए चाहते हैं, तो आप ऐसा कुछ कर सकते हैं, जो प्रत्येक कमांड को एक-एक करके चलाता है जब आप एक चर LN लाइन के अनुरूप होते हैं वह नंबर जो आप चलाना चाहते हैं। यह आपको अंतिम कमांड को फिर से सुपर आसान चलाने की अनुमति देता है, और फिर आप अगले कमांड पर जाने के लिए चर को बढ़ाते हैं।

मानते हैं कि आपके आदेश "it.sh" फ़ाइल में हैं, निम्न को एक-एक करके चलाएं।

$ cat it.sh 
echo "hi there" 
date 
ls -la /etc/passwd 

$ $(LN=1 && cat it.sh | head -n$LN | tail -n1) 
"hi there" 

$ $(LN=2 && cat it.sh | head -n$LN | tail -n1) 
Wed Feb 28 10:58:52 AST 2018 

$ $(LN=3 && cat it.sh | head -n$LN | tail -n1) 
-rw-r--r-- 1 root wheel 6774 Oct 2 21:29 /etc/passwd 
संबंधित मुद्दे