मैं "बैश-एक्स" (डिबग मोड) को कैसे खट्टी-मीठी स्क्रिप्ट में ला सकता हूं?


10

मैं डिबग करने की कोशिश कर रहा हूं कि लिनक्स के लिए लॉगिन इनिशियलाइज़ेशन पर बैश क्या करता है। मैंने पढ़ा है कि "बैश-एक्स" बैश प्रिंट बना देगा कि यह क्या कर रहा है, लेकिन यह "सेट -x" जैसी खट्टी फाइलों में कमांड नहीं प्रिंट करता है। मैं "सेट -x" का उपयोग नहीं कर सकता, क्योंकि आरंभीकरण इससे पहले कि मैं इसे कॉल कर सकूं। "बैश-एक्स" ओएस एक्स पर ठीक ठीक लग रहा है, लेकिन यह बैश संस्करणों के कारण हो सकता है।

लिनक्स: 3.2.25

ओएस एक्स: 3.2.48

यहाँ लिनक्स पर गैर-आवर्ती व्यवहार का एक अंश दिया गया है:

bash -l -x -c 'echo 1'
# ... snip ...
+ for i in '/etc/profile.d/*.sh'
+ '[' -r /etc/profile.d/vim.sh ']'
+ '[' '' ']'
+ . /etc/profile.d/vim.sh
+ for i in '/etc/profile.d/*.sh'
+ '[' -r /etc/profile.d/which-2.sh ']'
+ '[' '' ']'
+ . /etc/profile.d/which-2.sh
# ... snip ...

ध्यान दें कि कैसे /etc/profile.d/vim.sh खट्टा है, लेकिन इसके आदेश मुद्रित नहीं हैं। क्या बिना अपग्रेड के एक वर्कअराउंड है? क्या यह संस्करण अंतर के कारण है?

जवाबों:


1

set -xरूट फ़ाइल में कहीं (सभी अन्य फ़ाइलों की आवश्यकता वाले एक) को काम करना चाहिए। वैकल्पिक रूप से, [[ !-z "$DEBUG" ]] && set -xप्रत्येक फ़ाइल में कुछ की तरह परिचय करें, और कॉल करें DEBUG=1 script.sh


रूट फ़ाइल कहाँ है? क्या यह स्वतंत्र मंच है?
केल्विन

"रूट फाइल" के साथ मेरा मतलब है कि आप जिस फाइल को शेल पर कॉल कर रहे हैं, और जो अन्य फाइलों को इंपोर्ट कर रही है। मेरे उदाहरण में, रूट फाइल script.sh होगी
mkaito

1
लेकिन स्क्रिप्ट को चलाने से पहले बैश लॉगइन इनिशियलाइज़ेशन होता है। स्क्रिप्ट में "सेट -x" चलाने के लिए बहुत देर हो चुकी है। इसे स्वयं आज़माएं - "bash -l -x script.sh" चलाएं। आपकी स्क्रिप्ट के कमांड चलने से पहले आपको सामान दिखाई देगा।
केल्विन

पृथ्वी पर आप एक स्क्रिप्ट क्यों चलाएंगे bash -l? यह इंटरैक्टिव गोले के लिए है। एक स्क्रिप्ट एक इंटरैक्टिव खोल नहीं है।
mitoito

3
कृपया थोड़ा और खुले विचारों वाले बनें - जाहिर है कि बैश के रचनाकारों ने सोचा कि यह उपयोगी होगा। मुझे 2 उपयोग दिखाई देते हैं (कम से कम): 1) आप चलाना चाहते हैं ssh user@host 'bash -l -c command'ताकि आपको उचित एनवी लोड हो सके। 2) आप एक पापी व्यक्ति हैं और अपनी स्क्रिप्ट के चलने से पहले जो इनिट स्क्रिप्ट्स कर रहे हैं, उसका निवारण करना चाहते हैं - आपको दिखाएंगे। कभी-कभी आप जानना चाहते हैं कि एक एनवी चर कहाँ सेट किया जा रहा है। bash -l -x
केल्विन

0

चूंकि आप स्क्रिप्ट्स को सोर्स कर रहे हैं और निष्पादित नहीं कर रहे हैं, मुख्य स्क्रिप्ट में आपका पहला कमांड "सेट -x" होना चाहिए

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

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