কম্পিউটার

শেল ট্রেসিং সহ শেল স্ক্রিপ্টে কমান্ডের এক্সিকিউশন কীভাবে ট্রেস করবেন

শেল স্ক্রিপ্ট ডিবাগিং সিরিজের এই নিবন্ধে, আমরা তৃতীয় শেল স্ক্রিপ্ট ডিবাগিং মোড ব্যাখ্যা করব, এটি শেল ট্রেসিং এবং এটি কীভাবে কাজ করে এবং কীভাবে এটি ব্যবহার করা যেতে পারে তা প্রদর্শন করতে কিছু উদাহরণ দেখুন৷

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

  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. শেল স্ক্রিপ্টে সিনট্যাক্স চেকিং ডিবাগিং মোড কীভাবে সম্পাদন করবেন

  2. কাস্টম শেল ফাংশন এবং লাইব্রেরিগুলি কীভাবে লিখবেন এবং ব্যবহার করবেন

  3. কীভাবে একটি পাওয়ারশেল স্ক্রিপ্টে বিরাম যুক্ত করবেন (উদাহরণ সহ)

  4. 5টি ব্যবহারিক উদাহরণ সহ ব্যাশ স্ক্রিপ্টিং ভূমিকা টিউটোরিয়াল