Kaip atsekti „Shell Script“ komandų vykdymą su „Shell“ atsekimu


Šiame „shell script“ derinimo serijos straipsnyje paaiškinsime trečiąjį „shell script“ derinimo režimą, tai yra „shell“ atsekimą, ir apžvelgsime keletą pavyzdžių, kaip parodyti, kaip jis veikia ir kaip jį galima naudoti.

Ankstesnė šios serijos dalis aiškiai apšviečia du kitus apvalkalo scenarijų derinimo režimus: daugiažodį režimą ir sintaksės tikrinimo režimą su lengvai suprantamais pavyzdžiais, kaip įgalinti apvalkalo scenarijų derinimą šiais režimais.

  1. Kaip įgalinti „Shell Script“ derinimo režimą sistemoje „Linux“ - 1 dalis
  2. Kaip atlikti derinimo režimo tikrinimą „Shell“ scenarijų sintaksėje - 2 dalis

„Shell“ atsekimas paprasčiausiai reiškia komandų vykdymo susiejimą su „shell“ scenarijumi. Norėdami įjungti apvalkalo sekimą, naudokite derinimo parinktį -x .

Tai nurodo apvalkalą rodyti visas komandas ir jų argumentus terminale, kai jie vykdomi.

Mes naudosime žemiau pateiktą apvalkalo scenarijų sys_info.sh , kuris trumpai atspausdins jūsų sistemos datą ir laiką, prisijungusių vartotojų skaičių ir sistemos veikimo laiką. Tačiau joje yra sintaksės klaidų, kurias turime rasti ir ištaisyti.

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

Išsaugokite failą ir padarykite scenarijų vykdyti. Scenarijų gali paleisti tik root, todėl naudokite komandą sudo, kad paleistumėte jį taip, kaip nurodyta toliau:

$ chmod +x sys_info.sh
$ sudo bash -x sys_info.sh

Iš aukščiau pateiktos išvesties galime pastebėti, kad komanda pirmiausia vykdoma prieš jos išvestį pakeičiant kintamojo verte.

Pavyzdžiui, data buvo pirmą kartą įvykdyta ir jos išvestis pakeista kaip kintamojo DATE reikšmė.

Mes galime atlikti sintaksės tikrinimą, kad būtų rodomos tik sintaksės klaidos:

$ sudo bash -n sys_info.sh 

Jei kritiškai pažvelgsime į apvalkalo scenarijų, suprasime, kad if statement trūksta baigiamojo fi žodžio. Todėl pridėkime jį ir naujas scenarijus dabar turėtų atrodyti taip:

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

Dar kartą išsaugokite failą ir iškvieskite jį kaip root ir patikrinkite sintaksę:

$ sudo bash -n sys_info.sh

Aukščiau pateiktas mūsų sintaksės tikrinimo operacijos rezultatas vis dar rodo, kad 21 eilutėje yra dar viena klaida mūsų scenarijuje. Taigi, mes vis dar turime atlikti sintaksės taisymą.

Jei dar kartą analitiškai peržiūrėsime scenarijų, klaida 21 eilutėje yra dėl to, kad trūksta uždaromos dvigubos citatos (”) paskutinėje echo komandoje funkcijos print_sys_info viduje. .

Į komandą echo pridėsime baigiamąją dvigubą citatą ir išsaugosime failą. Pakeistas scenarijus yra žemiau:

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

Dabar sintaksiniu būdu dar kartą patikrinkite scenarijų.

$ sudo bash -n sys_info.sh

Aukščiau pateikta komanda nesukurs jokių rezultatų, nes mūsų scenarijus dabar yra sintaksiškai teisingas. Mes taip pat galime antrą kartą atsekti scenarijaus vykdymą ir tai turėtų gerai veikti:

$ sudo bash -x sys_info.sh

Dabar paleiskite scenarijų.

$ sudo ./sys_info.sh

„Shell Script“ vykdymo sekimo svarba

Korpuso scenarijaus sekimas padeda mums nustatyti sintaksės klaidas ir, dar svarbiau, logines klaidas. Paimkime, pvz., sys_info.sh apvalkalo scenarijaus funkciją check_root , skirtą nustatyti, ar vartotojas yra root, ar ne, nes scenarijų leidžiama vykdyti tik super vartotojo.

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

Magiją čia valdo if utasítás išraiška ["$UID" -ne "$ROOT_ID"]] , kai tik nenaudojame tinkamo skaitinio operatoriaus ( -ne šiuo atveju, o tai reiškia, kad nėra lygu), galiausiai padarysime loginę klaidą.

Darant prielaidą, kad naudojome -eq (reiškia lygu), tai leistų scenarijų paleisti bet kuriam sistemos vartotojui ir pagrindiniam vartotojui, taigi yra logiška klaida.

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

Pastaba: Kaip jau žiūrėjome anksčiau šios serijos pradžioje, nustatyta „shell“ įmontuota komanda gali suaktyvinti derinimą tam tikrame „shell“ scenarijaus skyriuje.

Todėl žemiau esanti eilutė padės mums rasti šią loginę klaidą funkcijoje, atsekant jos vykdymą:

Scenarijus su logine klaida:

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

Išsaugokite failą ir iškvieskite scenarijų, matome, kad įprastas sistemos vartotojas gali paleisti scenarijų be sudo, kaip nurodyta toliau pateiktame išvestyje. Taip yra todėl, kad USER_ID vertė yra 100, kuri nėra lygi šakninei ROOT_ID, kuri yra 0.

$ ./sys_info.sh

Na, dabar viskas, mes atėjome prie „shell“ scenarijų derinimo serijos pabaigos, toliau pateiktą atsakymo formą galima naudoti norint pateikti mums bet kokius klausimus ar atsiliepimus, susijusius su šiuo vadovu ar visa 3 dalių serija.