ഷെൽ ട്രേസിംഗ് ഉപയോഗിച്ച് ഷെൽ സ്uക്രിപ്റ്റിൽ കമാൻഡ് എക്uസിക്യൂഷൻ എങ്ങനെ കണ്ടെത്താം


ഷെൽ സ്uക്രിപ്uറ്റ് ഡീബഗ്ഗിംഗ് സീരീസിന്റെ ഈ ലേഖനത്തിൽ, ഷെൽ ട്രെയ്uസിംഗ് എന്ന മൂന്നാമത്തെ ഷെൽ സ്uക്രിപ്റ്റ് ഡീബഗ്ഗിംഗ് മോഡ് ഞങ്ങൾ വിശദീകരിക്കും, അത് എങ്ങനെ പ്രവർത്തിക്കുന്നു, അത് എങ്ങനെ ഉപയോഗിക്കാമെന്ന് കാണിക്കാൻ ചില ഉദാഹരണങ്ങൾ നോക്കുക.

ഈ ശ്രേണിയുടെ മുൻഭാഗം മറ്റ് രണ്ട് ഷെൽ സ്uക്രിപ്റ്റ് ഡീബഗ്ഗിംഗ് മോഡുകളിലേക്ക് വ്യക്തമായി വെളിച്ചം വീശുന്നു: ഈ മോഡുകളിൽ ഷെൽ സ്uക്രിപ്റ്റ് ഡീബഗ്ഗിംഗ് എങ്ങനെ പ്രവർത്തനക്ഷമമാക്കാം എന്നതിന്റെ എളുപ്പത്തിൽ മനസ്സിലാക്കാവുന്ന ഉദാഹരണങ്ങളുള്ള വെർബോസ് മോഡും സിന്റാക്സ് ചെക്കിംഗ് മോഡും.

  1. ലിനക്സിൽ ഷെൽ സ്ക്രിപ്റ്റ് ഡീബഗ്ഗിംഗ് മോഡ് എങ്ങനെ പ്രവർത്തനക്ഷമമാക്കാം - ഭാഗം 1
  2. ഷെൽ സ്ക്രിപ്റ്റുകളിൽ സിന്റാക്സ് ചെക്കിംഗ് ഡീബഗ്ഗിംഗ് മോഡ് എങ്ങനെ നടത്താം - ഭാഗം 2

ഷെൽ ട്രെയ്uസിംഗ് എന്നാൽ ഷെൽ സ്uക്രിപ്റ്റിലെ കമാൻഡുകളുടെ എക്uസിക്യൂഷൻ ട്രെയ്uസ് ചെയ്യുക എന്നാണ് അർത്ഥമാക്കുന്നത്. ഷെൽ ട്രെയ്uസിംഗ് ഓണാക്കാൻ, -x ഡീബഗ്ഗിംഗ് ഓപ്ഷൻ ഉപയോഗിക്കുക.

എല്ലാ കമാൻഡുകളും അവയുടെ ആർഗ്യുമെന്റുകളും എക്സിക്യൂട്ട് ചെയ്യുമ്പോൾ ടെർമിനലിൽ പ്രദർശിപ്പിക്കാൻ ഇത് ഷെല്ലിനെ നയിക്കുന്നു.

ഞങ്ങൾ ചുവടെയുള്ള sys_info.sh ഷെൽ സ്uക്രിപ്റ്റ് ഉപയോഗിക്കും, അത് നിങ്ങളുടെ സിസ്റ്റം തീയതിയും സമയവും, ലോഗിൻ ചെയ്uതിരിക്കുന്ന ഉപയോക്താക്കളുടെ എണ്ണം, സിസ്റ്റം പ്രവർത്തന സമയം എന്നിവ സംക്ഷിപ്തമായി പ്രിന്റ് ചെയ്യുന്നു. എന്നിരുന്നാലും, നമ്മൾ കണ്ടെത്തി തിരുത്തേണ്ട വാക്യഘടന പിശകുകൾ ഇതിൽ അടങ്ങിയിരിക്കുന്നു.

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

മുകളിലുള്ള ഔട്ട്uപുട്ടിൽ നിന്ന്, ഒരു കമാൻഡ് അതിന്റെ ഔട്ട്uപുട്ട് ഒരു വേരിയബിളിന്റെ മൂല്യമായി മാറ്റിസ്ഥാപിക്കുന്നതിന് മുമ്പ് ആദ്യം എക്uസിക്യൂട്ട് ചെയ്യുന്നത് നിരീക്ഷിക്കാൻ കഴിയും.

ഉദാഹരണത്തിന്, തീയതി ആദ്യം എക്സിക്യൂട്ട് ചെയ്യുകയും അതിന്റെ ഔട്ട്പുട്ട് DATE എന്ന വേരിയബിളിന്റെ മൂല്യമായി പകരം വയ്ക്കുകയും ചെയ്തു.

വാക്യഘടന പിശകുകൾ ഇനിപ്പറയുന്ന രീതിയിൽ പ്രദർശിപ്പിക്കുന്നതിന് നമുക്ക് വാക്യഘടന പരിശോധന നടത്താം:

$ sudo bash -n sys_info.sh 

നമ്മൾ ഷെൽ സ്ക്രിപ്റ്റ് വിമർശനാത്മകമായി നോക്കുകയാണെങ്കിൽ, if സ്റ്റേറ്റ്മെന്റ് ഒരു ക്ലോസിംഗ് 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 വരിയിലെ ഞങ്ങളുടെ സ്uക്രിപ്റ്റിൽ ഒരു ബഗ് കൂടി ഉണ്ടെന്ന് കാണിക്കുന്നു. അതിനാൽ, ഞങ്ങൾക്ക് ഇനിയും ചില വാക്യഘടന തിരുത്തലുകൾ ചെയ്യാനുണ്ട്.

നമ്മൾ സ്uക്രിപ്റ്റിലൂടെ ഒരു തവണ കൂടി വിശകലനപരമായി നോക്കിയാൽ, print_sys_info ഫംഗ്uഷനിലെ അവസാന എക്കോ കമാൻഡിലെ (”) ക്ലോസിംഗ് ഡബിൾ ക്വോട്ട് നഷ്ടപ്പെട്ടതാണ് ലൈൻ 21-ലെ പിശകിന് കാരണം. .

ഞങ്ങൾ 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

മുകളിലെ കമാൻഡ് ഒരു ഔട്ട്പുട്ടും നൽകില്ല, കാരണം നമ്മുടെ സ്ക്രിപ്റ്റ് ഇപ്പോൾ വാക്യഘടനാപരമായി ശരിയാണ്. സ്uക്രിപ്uറ്റിന്റെ എക്uസിക്യൂഷൻ എല്ലാം നമുക്ക് രണ്ടാം തവണയും കണ്ടെത്താനാകും, അത് നന്നായി പ്രവർത്തിക്കണം:

$ sudo bash -x sys_info.sh

ഇപ്പോൾ സ്ക്രിപ്റ്റ് പ്രവർത്തിപ്പിക്കുക.

$ sudo ./sys_info.sh

ഷെൽ സ്uക്രിപ്റ്റ് എക്uസിക്യൂഷൻ ട്രെയ്uസിംഗിന്റെ പ്രാധാന്യം

വാക്യഘടന പിശകുകളും അതിലും പ്രധാനമായി ലോജിക്കൽ പിശകുകളും തിരിച്ചറിയാൻ ഷെൽ സ്uക്രിപ്റ്റ് ട്രെയ്uസിംഗ് ഞങ്ങളെ സഹായിക്കുന്നു. ഉദാഹരണത്തിന്, sys_info.sh ഷെൽ സ്uക്രിപ്റ്റിലെ check_root ഫംഗ്uഷൻ എടുക്കുക, ഇത് ഒരു ഉപയോക്താവ് റൂട്ടാണോ അല്ലയോ എന്ന് നിർണ്ണയിക്കാൻ ഉദ്ദേശിച്ചുള്ളതാണ്, കാരണം സ്uക്രിപ്റ്റ് എക്uസിക്യൂട്ട് ചെയ്യാൻ മാത്രമേ അനുവദിക്കൂ. സൂപ്പർ യൂസർ മുഖേന.

check_root(){
    if [ "$UID" -ne "$ROOT_ID" ]; then
        echo "You are not allowed to execute this program!"
        exit 1;
    fi
}

ഇവിടെ മാന്ത്രികത നിയന്ത്രിക്കുന്നത് if സ്റ്റേറ്റ്മെന്റ് എക്സ്പ്രഷൻ [ \$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
}

ശ്രദ്ധിക്കുക: ഈ സീരീസിന്റെ തുടക്കത്തിൽ നമ്മൾ മുമ്പ് നോക്കിയത് പോലെ, സെറ്റ് ഷെൽ ബിൽറ്റ്-ഇൻ കമാൻഡിന് ഒരു ഷെൽ സ്ക്രിപ്റ്റിന്റെ ഒരു പ്രത്യേക വിഭാഗത്തിൽ ഡീബഗ്ഗിംഗ് സജീവമാക്കാൻ കഴിയും.

അതിനാൽ, ഫംഗ്uഷനിലെ ഈ ലോജിക്കൽ പിശക് അതിന്റെ എക്uസിക്യൂഷൻ ട്രെയ്uസ് ചെയ്uത് കണ്ടെത്താൻ ചുവടെയുള്ള വരി ഞങ്ങളെ സഹായിക്കും:

ഒരു ലോജിക്കൽ പിശകുള്ള സ്ക്രിപ്റ്റ്:

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

ഫയൽ സേവ് ചെയ്uത് സ്uക്രിപ്റ്റ് ഇൻവോക്ക് ചെയ്യുക, ഒരു സാധാരണ സിസ്റ്റം ഉപയോക്താവിന് ചുവടെയുള്ള ഔട്ട്uപുട്ടിലെ പോലെ സുഡോ ഇല്ലാതെ സ്uക്രിപ്റ്റ് പ്രവർത്തിപ്പിക്കാൻ കഴിയുമെന്ന് നമുക്ക് കാണാൻ കഴിയും. കാരണം, USER_ID യുടെ മൂല്യം 100 ആണ്, അത് റൂട്ട് ROOT_ID ന് തുല്യമല്ല, അത് 0 ആണ്.

$ ./sys_info.sh

ശരി, ഇപ്പോൾ അത്രയേയുള്ളൂ, ഞങ്ങൾ ഷെൽ സ്uക്രിപ്റ്റ് ഡീബഗ്ഗിംഗ് സീരീസിന്റെ അവസാനത്തിലെത്തി, ഈ ഗൈഡിനെക്കുറിച്ചോ 3-ഭാഗ പരമ്പരയെക്കുറിച്ചോ ഞങ്ങൾക്ക് എന്തെങ്കിലും ചോദ്യങ്ങളോ ഫീഡ്uബാക്കുകളോ അഭിമുഖീകരിക്കാൻ ചുവടെയുള്ള പ്രതികരണ ഫോം ഉപയോഗിക്കാം.