Kako slediti izvrševanju ukazov v skriptu lupine s sledenjem lupine


V tem članku serije odpravljanja napak skriptov lupine bomo razložili tretji način odpravljanja napak skriptov lupine, to je sledenje lupine, in si ogledali nekaj primerov, da dokažemo, kako deluje in kako se lahko uporablja.

Prejšnji del te serije jasno osvetljuje dva druga načina odpravljanja napak skriptov lupine: podroben način in način preverjanja sintakse z lahko razumljivimi primeri, kako v teh načinih omogočiti razhroščevanje skriptov lupine.

  1. Kako v Linuxu omogočiti način odpravljanja napak v skriptu lupine - 1. del
  2. Kako izvesti način za odpravljanje napak pri preverjanju sintakse v skriptih lupine - 2. del

Sledenje lupinam preprosto pomeni sledenje izvajanju ukazov v skriptu lupine. Če želite vklopiti sledenje lupine, uporabite možnost odpravljanja napak -x .

To usmerja lupino, da pri izvajanju prikaže vse ukaze in njihove argumente na terminalu.

Spodaj bomo uporabili skript lupine sys_info.sh , ki na kratko natisne sistemski datum in uro, število prijavljenih uporabnikov in čas delovanja sistema. Vsebuje pa sintaksne napake, ki jih moramo najti in popraviti.

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

Shranite datoteko in naredite skript izvršljiv. Skript lahko zažene samo root, zato uporabite ukaz sudo, da ga zaženete kot spodaj:

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

Iz zgornjega izhoda lahko opazimo, da se ukaz najprej izvede, preden se njegov izhod nadomesti kot vrednost spremenljivke.

Na primer, datum je bil prvič izveden in njegov izhod je bil nadomeščen kot vrednost spremenljivke DATE.

Sintaksno preverjanje lahko izvedemo tako, da sintaksne napake prikažemo samo na naslednji način:

$ sudo bash -n sys_info.sh 

Če kritično pogledamo lupinski skript, bomo ugotovili, da v stavku if manjka zaključna beseda fi . Zato ga dodajte, novi skript pa naj bo zdaj videti spodaj:

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

Datoteko znova shranite in jo prikličite kot root in preverite skladnjo:

$ sudo bash -n sys_info.sh

Rezultat našega preverjanja skladnje zgoraj še vedno kaže, da je v našem skriptu v vrstici 21 še ena napaka. Torej, še vedno moramo opraviti nekaj popravkov skladnje.

Če še enkrat analitično preiščemo skript, je napaka v vrstici 21 posledica manjkajočega zaključnega dvojnega narekovaja (”) v zadnjem ukazu echo znotraj funkcije print_sys_info .

V ukaz echo bomo dodali zaključni dvojni narekovaj in shranili datoteko. Spremenjeni skript je spodaj:

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

Zdaj sintaksično še enkrat preverite skript.

$ sudo bash -n sys_info.sh

Zgornji ukaz ne bo dal nobenega rezultata, ker je naš skript zdaj skladen z besedami. Izvedbo skripta lahko sledimo tudi drugič, kar bi moralo dobro delovati:

$ sudo bash -x sys_info.sh

Zdaj zaženite skript.

$ sudo ./sys_info.sh

Pomen sledenja izvrševanju skriptov lupine

Sledenje skript lupine nam pomaga prepoznati sintaksne napake in še pomembneje logične napake. Vzemimo na primer funkcijo check_root v skriptu lupine sys_info.sh , ki naj bi ugotovila, ali je uporabnik root ali ne, saj je skript dovoljen samo za izvajanje s strani super uporabnika.

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

Magijo tukaj nadzoruje izraz if statement [\ "$UID \" -ne\"$ROOT_ID \"] , ko ne uporabimo ustreznega številskega operaterja (v tem primeru -ne , kar pomeni, da ni enako), imamo na koncu možno logično napako.

Ob predpostavki, da smo uporabili -eq (pomeni enako), bi to omogočilo vsakemu uporabniku sistema in korenskemu uporabniku, da zažene skript, torej logična napaka.

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

Opomba: Kot smo že videli na začetku te serije, lahko vdelani ukaz set shell aktivira odpravljanje napak v določenem odseku skripta lupine.

Zato nam bo spodnja vrstica pomagala najti to logično napako v funkciji s sledenjem njene izvedbe:

Skript z logično napako:

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

Shranite datoteko in pokličite skript, vidimo lahko, da lahko običajni sistemski uporabnik skript zažene brez sudo, kot je prikazano spodaj. To je zato, ker je vrednost USER_ID 100, kar ni enako korenskemu ROOT_ID, ki je 0.

$ ./sys_info.sh

No, to je to za zdaj, prišli smo do konca serije odpravljanja napak skriptov lupine, spodnji odzivni obrazec lahko uporabite za naslavljanje kakršnih koli vprašanj ali povratnih informacij v zvezi s tem vodnikom ali celotno 3-delno serijo.