কম্পিউটার টিউটোরিয়াল

শেল ট্রেসিং মাস্টার করুন: ধাপে ধাপে কমান্ড এক্সিকিউশন ডিবাগিং

শেল স্ক্রিপ্ট ডিবাগিং সিরিজের এই আর্টিকেলে, আমরা থার্ড শেল স্ক্রিপ্ট ডিবাগিং মোড, অর্থাৎ শেল ট্রেসিং ব্যাখ্যা করব এবং কিছু উদাহরণ দেখব কীভাবে এটি কাজ করে এবং কীভাবে এটি ব্যবহার করা যেতে পারে।

এই সিরিজের পূর্বের অংশ দুটি অন্যান্য শেল স্ক্রিপ্ট ডিবাগিং মোড: ভার্বোজ মোড এবং সিনট্যাক্স চেকিং মোড সম্পর্কে সহজে বোঝার উদাহরণসহ স্পষ্টভাবে আলোকপাত করেছিল।

  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

আমাদের সিনট্যাক্স চেকিং অপারেশনের ফলাফল উপরে এখনও দেখাচ্ছে যে আমাদের স্ক্রিপ্টে লাইন ২১-এ আরো একটি বাগ রয়েছে। তাই, আমাদের এখনও কিছু সিনট্যাক্স সংশোধন বাকি।

আমরা যদি একবার nữa স্ক্রিপ্টটি বিশ্লেষণমূলকভাবে দেখি, লাইন ২১-এ এররটি হলো 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
}

নোট: যেনো আমরা এই সিরিজের শুরুতে দেখেছিলাম, set শেল বিল্ট-ইন কমান্ড একটি শেল স্ক্রিপ্টের নির্দিষ্ট অংশে ডিবাগিং সক্রিয় করতে পারে।

তাই নিচের লাইনটি ফাংশনের এক্সিকিউশন ট্রেস করে এই লজিক্যাল এররটি খুঁজে বের করতে সাহায্য করবে:

লজিক্যাল এরর সহ স্ক্রিপ্ট:

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

ভালো, এখন শেল স্ক্রিপ্ট ডিবাগিং সিরিজের শেষে এসেছি, নিচের রেসপন্স ফর্ম ব্যবহার করে এই গাইড বা পুরো ৩-পার্ট সিরিজ সংক্রান্ত যেকোনো প্রশ্ন বা ফিডব্যাক আমাদের জানাতে পারেন।

  1. শেল স্ক্রিপ্ট সিনট্যাক্স চেকিং মাস্টার করুন: একটি প্র্যাক্টিক্যাল ডিবাগিং গাইড

  2. কাস্টম শেল ফাংশন ও লাইব্রেরি মাস্টার করুন: লিনাক্স ব্যবহারকারীদের জন্য প্র্যাকটিক্যাল গাইড

  3. PowerShell-এ Delay যোগ করুন: সহজ Pause কমান্ড এবং ব্যবহারিক উদাহরণ

  4. ব্যাশ স্ক্রিপ্টিং মাস্টার করুন: ৫টি রিয়েল-ওয়ার্ল্ড উদাহরণসহ প্র্যাক্টিক্যাল ইন্ট্রোডাকশন