Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> बाश प्रोग्रामिंग

शैल ट्रेसिंग के साथ शैल स्क्रिप्ट में कमांड के निष्पादन का पता कैसे लगाएं

शेल स्क्रिप्ट डिबगिंग श्रृंखला के इस लेख में, हम तीसरे शेल स्क्रिप्ट डिबगिंग मोड की व्याख्या करेंगे, जो कि शेल ट्रेसिंग है और यह कैसे काम करता है, और इसका उपयोग कैसे किया जा सकता है, यह प्रदर्शित करने के लिए कुछ उदाहरण देखें।

इस श्रृंखला का पिछला भाग दो अन्य शेल स्क्रिप्ट डिबगिंग मोड पर स्पष्ट रूप से प्रकाश डालता है:वर्बोज़ मोड और वाक्यविन्यास जांच इन मोड में शेल स्क्रिप्ट डिबगिंग को सक्षम करने के आसान उदाहरणों के साथ मोड।

  1. लिनक्स में शेल स्क्रिप्ट डिबगिंग मोड को कैसे सक्षम करें - भाग 1
  2. शैल स्क्रिप्ट में सिंटेक्स चेकिंग डिबगिंग मोड कैसे करें - भाग 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 . के मान के रूप में प्रतिस्थापित किया गया था ।

हम सिंटैक्स त्रुटियों को केवल निम्नानुसार प्रदर्शित करने के लिए सिंटैक्स जाँच कर सकते हैं:

$ 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 . के अंदर अंतिम इको कमांड में समारोह।

हम समापन दोहरे उद्धरण को गूंज . में जोड़ देंगे कमांड करें और फाइल को सेव करें। बदली हुई स्क्रिप्ट नीचे है:

#!/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
शैल ट्रेसिंग के साथ शैल स्क्रिप्ट में कमांड के निष्पादन का पता कैसे लगाएं शैल ट्रेसिंग के साथ शैल स्क्रिप्ट में कमांड के निष्पादन का पता कैसे लगाएं

शैल स्क्रिप्ट निष्पादन ट्रेसिंग का महत्व

शेल स्क्रिप्ट ट्रेसिंग हमें सिंटैक्स त्रुटियों और अधिक महत्वपूर्ण तार्किक त्रुटियों की पहचान करने में मदद करती है। उदाहरण के लिए check_root . लें sys_info.sh . में कार्य करें शेल स्क्रिप्ट, जिसका उद्देश्य यह निर्धारित करना है कि उपयोगकर्ता रूट है या नहीं, क्योंकि स्क्रिप्ट को केवल सुपरयूज़र द्वारा निष्पादित करने की अनुमति है।

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-भाग श्रृंखला से संबंधित किसी भी प्रश्न या प्रतिक्रिया को संबोधित करने के लिए किया जा सकता है।

  1. कस्टम शैल फ़ंक्शंस और पुस्तकालयों को कैसे लिखें और उपयोग करें

    Linux में, शेल स्क्रिप्ट कई अलग-अलग तरीकों से हमारी मदद करती हैं, जिसमें कुछ सिस्टम व्यवस्थापन कार्यों को निष्पादित करना या स्वचालित करना, सरल कमांड लाइन टूल बनाना और बहुत कुछ शामिल हैं। इस गाइड में, हम नए लिनक्स उपयोगकर्ताओं को दिखाएंगे कि कस्टम शेल स्क्रिप्ट को मज़बूती से कहाँ संग्रहीत किया जाए,

  1. पॉवरशेल स्क्रिप्ट में विराम कैसे जोड़ें (उदाहरणों के साथ)

    इस लेख में मैं आपको दिखाऊंगा कि एक पॉवरशेल स्क्रिप्ट में एक विराम कैसे जोड़ा जाता है। ऐसे कई अलग-अलग तरीके हैं जिनसे आप विराम या प्रतीक्षा आदेश जोड़ सकते हैं, नीचे मैं आपको उदाहरणों के साथ ये तरीके दिखाऊंगा। पॉवरशेल स्क्रिप्ट में विराम कैसे जोड़ें पॉवरशेल स्क्रिप्ट में विराम जोड़ने के लिए इन चरण

  1. बैश स्क्रिप्टिंग परिचय ट्यूटोरियल 5 व्यावहारिक उदाहरणों के साथ

    हमारी चल रही यूनिक्स सेड और यूनिक्स Awk श्रृंखला के समान, हम बैश स्क्रिप्टिंग पर कई लेख पोस्ट करेंगे, जो सभी बैश स्क्रिप्टिंग तकनीकों को व्यावहारिक उदाहरणों के साथ कवर करेगा। शेल एक प्रोग्राम है, जो यूजर कमांड की व्याख्या करता है। कमांड या तो उपयोगकर्ता द्वारा सीधे दर्ज किए जाते हैं या शेल स्क्रिप्