कैसे लाइन द्वारा बैश स्क्रिप्ट लाइन निष्पादित?


93

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

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


1
शायद अधिक मोटे तौर पर stackoverflow.com/questions/951336/how-to-debug-a-bash-script/…
tripleee

जवाबों:


126

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

#!/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 >

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


1
फिर आप अगली पंक्ति (अगली कमांड को कैसे चलाते हैं) के लिए कदम बढ़ाते हैं?
डेविड डोरिया

2
यह हर कमांड पर एक जाल बिछाता है। केवल एक चीज जो आपको करने की ज़रूरत है वह अगले कमांड पर जाने के लिए रिटर्न दबा रही है
कार्बनिक-मैशप

1
अगर आपके पास कमांड लाइन "इस तरह पढ़ी जाती है, तो" $ $ लाइन करो; इको $ लाइन; किया <somefile ", वह विधि काम नहीं करती है क्योंकि" ट्रैप रीड
डेबग

3
आप इसे कैसे रोक सकते हैं? मैं स्क्रिप्ट के अंत में कदम रखने के बाद, शेल की तरह कार्य करता है, स्क्रिप्ट अभी भी चल रही है।
स्लैशडॉटिर

1
trap 'read -u1' debugफ़ाइल रीडायरेक्शन समस्या को ओवरराइड करने के लिए बदलें ।
user3132194

23

हो सकता है कि BASH डिबगर आपके लिए कुछ है।


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

1
@studgeek यह Redhat / CentOS आदि पर उपलब्ध नहीं है, इसलिए मैं इसे "अधिकांश सिस्टम" नहीं कहूंगा।
सजुकुक

@ सजूक, इसे पैक नहीं किया जा सकता है , लेकिन यह बिल्कुल उपलब्ध है
चार्ल्स डफी

brew install bashdb
macOS

@CharlesDuffy: यह डिफ़ॉल्ट उबंटू रिपोज में भी नहीं है।
डैन डस्केल्सस्कू

2

यदि आपकी बैश स्क्रिप्ट वास्तव में एक बंद आदेशों का एक गुच्छा है जिसे आप एक-एक करके चलाना चाहते हैं, तो आप कुछ ऐसा कर सकते हैं, जो एक चर को बढ़ाते समय प्रत्येक कमांड को एक-एक करके चलाता है, जिस 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


1

xargs: लाइनों को फ़िल्टर कर सकते हैं

cat .bashrc | xargs -0 -l -d \\n bash
  • -0 कच्चे इनपुट के रूप में माना जाता है (कोई बच नहीं)
  • प्रत्येक पंक्ति को अलग करें (प्रदर्शन के लिए डिफ़ॉल्ट रूप से नहीं)
  • -d \\ n लाइन विभाजक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.