शेल स्क्रिप्ट डीबगिंग श्रृंखला के इस लेख में, हम तीसरे शेल स्क्रिप्ट डीबगिंग मोड, यानी शेल ट्रेसिंग की व्याख्या करेंगे और यह दिखाने के लिए कुछ उदाहरण देखेंगे कि यह कैसे काम करता है, और इसका उपयोग कैसे किया जा सकता है।
इस श्रृंखला का पिछला भाग दो अन्य शेल स्क्रिप्ट डीबगिंग मोड्स पर स्पष्ट रूप से प्रकाश डालता है: वर्बोज़ मोड और सिंटैक्स चेकिंग मोड, शेल स्क्रिप्ट डीबगिंग को इन मोड्स में कैसे सक्षम करें, इसके आसान समझे जाने वाले उदाहरणों के साथ।
- Linux में शेल स्क्रिप्ट डीबगिंग मोड कैसे सक्षम करें - भाग 1
- शेल स्क्रिप्ट्स में सिंटैक्स चेकिंग डीबगिंग मोड कैसे करें - भाग 2
शेल ट्रेसिंग का सीधा सा मतलब है शेल स्क्रिप्ट में कमांड्स के निष्पादन को ट्रेस करना। शेल ट्रेसिंग चालू करने के लिए, -x डीबगिंग विकल्प का उपयोग करें।
यह शेल को सभी कमांड्स और उनके आर्गुमेंट्स को टर्मिनल पर प्रदर्शित करने का निर्देश देता है जैसे ही वे निष्पादित होते हैं।
हम नीचे दिए गए sys_info.sh शेल स्क्रिप्ट का उपयोग करेंगे, जो संक्षेप में आपके सिस्टम की तारीख और समय, लॉग इन उपयोगकर्ताओं की संख्या, और सिस्टम अपटाइम प्रिंट करता है। हालांकि, इसमें सिंटैक्स त्रुटियां हैं जिन्हें हमें ढूंढना और सही करना है।
#!/bin/bash #script to print brief system info ROOT_ID="0" DATE=`date` NO_USERS=`who | wc -l` UPTIME=`uptime` check_root(){ if [ "$UID" -ne "$ROOT_ID" ]; then echo "You are not allowed to execute this program!" exit 1; } print_sys_info(){ echo "System Time : $DATE" echo "Number of users: $NO_USERS" echo "System Uptime : $UPTIME } check_root print_sys_info exit 0
फ़ाइल सहेजें और स्क्रिप्ट को निष्पादन योग्य बनाएं। स्क्रिप्ट केवल रूट द्वारा चलाई जा सकती है, इसलिए इसे नीचे दिखाए अनुसार sudo कमांड का उपयोग करके रूट के रूप में चलाएं:
$ chmod +x sys_info.sh $ sudo bash -x sys_info.sh
उपरोक्त आउटपुट से, हम देख सकते हैं कि, एक कमांड पहले निष्पादित होती है इससे पहले कि उसका आउटपुट एक वेरिएबल के मान के रूप में प्रतिस्थापित हो।
उदाहरण के लिए, date पहले निष्पादित हुआ और फिर उसका आउटपुट वेरिएबल DATE के मान के रूप में प्रतिस्थापित हुआ।
हम केवल सिंटैक्स त्रुटियों को प्रदर्शित करने के लिए सिंटैक्स चेकिंग कर सकते हैं:
$ sudo bash -n sys_info.sh
यदि हम शेल स्क्रिप्ट को गंभीरता से देखें, तो हमें एहसास होगा कि if statement में एक समापन fi शब्द गायब है। इसलिए, आइए इसे जोड़ें और नई स्क्रिप्ट अब नीचे जैसी दिखनी चाहिए:
#!/bin/bash #script to print brief system info ROOT_ID="0" DATE=`date` NO_USERS=`who | wc -l` UPTIME=`uptime` check_root(){ if [ "$UID" -ne "$ROOT_ID" ]; then echo "You are not allowed to execute this program!" exit 1; fi } print_sys_info(){ echo "System Time : $DATE" echo "Number of users: $NO_USERS" echo "System Uptime : $UPTIME } check_root print_sys_info exit 0
फ़ाइल को फिर से सहेजें और इसे रूट के रूप में आह्वान करें और कुछ सिंटैक्स चेकिंग करें:
$ sudo bash -n sys_info.sh
हमारे ऊपर के सिंटैक्स चेकिंग ऑपरेशन का परिणाम अभी भी दिखाता है कि हमारी स्क्रिप्ट में लाइन 21 पर एक और बग है। इसलिए, हमारे पास अभी भी कुछ सिंटैक्स सुधार करने हैं।
यदि हम स्क्रिप्ट का एक बार और विश्लेषणात्मक रूप से देखें, तो लाइन 21 पर त्रुटि print_sys_info फ़ंक्शन के अंदर अंतिम echo कमांड में एक समापन डबल कोट (”) गायब होने के कारण है।
हम echo कमांड में समापन डबल कोट जोड़ेंगे और फ़ाइल सहेजेंगे। बदली हुई स्क्रिप्ट नीचे है:
#!/bin/bash #script to print brief system info ROOT_ID="0" DATE=`date` NO_USERS=`who | wc -l` UPTIME=`uptime` check_root(){ if [ "$UID" -ne "$ROOT_ID" ]; then echo "You are not allowed to execute this program!" exit 1; fi } print_sys_info(){ echo "System Time : $DATE" echo "Number of users: $NO_USERS" echo "System Uptime : $UPTIME" } check_root print_sys_info exit 0
अब एक बार फिर स्क्रिप्ट को सिंटैक्टिकली जांचें।
$ sudo bash -n sys_info.sh
उपरोक्त कमांड कोई आउटपुट उत्पन्न नहीं करेगा क्योंकि हमारी स्क्रिप्ट अब सिंटैक्टिकली सही है। हम स्क्रिप्ट के निष्पादन को दूसरी बार भी ट्रेस कर सकते हैं और यह अच्छी तरह से काम करना चाहिए:
$ sudo bash -x sys_info.sh

अब स्क्रिप्ट चलाएं।
$ sudo ./sys_info.sh

शेल स्क्रिप्ट निष्पादन ट्रेसिंग का महत्व
शेल स्क्रिप्ट ट्रेसिंग हमें सिंटैक्स त्रुटियों और अधिक महत्वपूर्ण रूप से, तार्किक त्रुटियों की पहचान करने में मदद करती है। उदाहरण के लिए sys_info.sh शेल स्क्रिप्ट में check_root फ़ंक्शन लें, जिसका उद्देश्य यह निर्धारित करना है कि कोई उपयोगकर्ता रूट है या नहीं, चूंकि स्क्रिप्ट केवल सुपरयूज़र द्वारा निष्पादित करने की अनुमति है।
check_root(){ if [ "$UID" -ne "$ROOT_ID" ]; then echo "You are not allowed to execute this program!" exit 1; fi }
यह जादू if statement एक्सप्रेशन [ "$UID" -ne "$ROOT_ID" ] द्वारा नियंत्रित होता है, एक बार जब हम उपयुक्त संख्यात्मक ऑपरेटर (-ne इस मामले में, जिसका अर्थ है बराबर नहीं) का उपयोग नहीं करते हैं, तो हम एक संभावित तार्किक त्रुटि के साथ समाप्त होते हैं।
मान लें कि हमने -eq (बराबर का अर्थ) का उपयोग किया, यह किसी भी सिस्टम उपयोगकर्ता के साथ-साथ रूट उपयोगकर्ता को स्क्रिप्ट चलाने की अनुमति देगा, इसलिए एक तार्किक त्रुटि।
check_root(){ if [ "$UID" -eq "$ROOT_ID" ]; then echo "You are not allowed to execute this program!" exit 1; fi }
नोट: जैसा कि हमने इस श्रृंखला की शुरुआत में देखा था, सेट शेल बिल्ट-इन कमांड शेल स्क्रिप्ट के एक विशेष खंड में डीबगिंग को सक्रिय कर सकती है।
इसलिए, नीचे दी गई लाइन फ़ंक्शन के निष्पादन को ट्रेस करके इस तार्किक त्रुटि को खोजने में हमारी मदद करेगी:
तार्किक त्रुटि वाली स्क्रिप्ट:
#!/bin/bash #script to print brief system info ROOT_ID="0" DATE=`date` NO_USERS=`who | wc -l` UPTIME=`uptime` check_root(){ if [ "$UID" -eq "$ROOT_ID" ]; then echo "You are not allowed to execute this program!" exit 1; fi } print_sys_info(){ echo "System Time : $DATE" echo "Number of users: $NO_USERS" echo "System Uptime : $UPTIME" } #turning on and off debugging of check_root function set -x ; check_root; set +x ; print_sys_info exit 0
फ़ाइल सहेजें और स्क्रिप्ट को आह्वान करें, हम देख सकते हैं कि एक नियमित सिस्टम उपयोगकर्ता नीचे दिए गए आउटपुट में दिखाए अनुसार sudo के बिना स्क्रिप्ट चला सकता है। ऐसा इसलिए है क्योंकि USER_ID का मान 100 है जो रूट ROOT_ID जो 0 है, के बराबर नहीं है।
$ ./sys_info.sh
खैर, अभी के लिए बस इतना ही, हम शेल स्क्रिप्ट डीबगिंग श्रृंखला के अंत में आ गए हैं, नीचे दिए गए प्रतिक्रिया फॉर्म का उपयोग इस गाइड या पूरे 3-भाग श्रृंखला के संबंध में किसी भी प्रश्न या प्रतिक्रिया को संबोधित करने के लिए किया जा सकता है।