Hvernig á að rekja framkvæmd skipana í Shell Script með Shell Tracing


Í þessari grein í kembiforritakembunarröðinni munum við útskýra þriðju kembiforritaleitarhaminn fyrir skeljaforskriftir, það er að rekja skel og skoða nokkur dæmi til að sýna fram á hvernig það virkar og hvernig hægt er að nota það.

Fyrri hluti þessarar seríu varpar greinilega ljósi á hinar tvær aðrar kembiforritaleitarstillingar fyrir skeljaforskriftir: orðlausan háttur og setningafræðiathugunarhamur með auðskiljanlegum dæmum um hvernig á að virkja kembiforritavillu í þessum stillingum.

  1. Hvernig á að virkja Shell Script villuleitarham í Linux – Part 1
  2. Hvernig á að framkvæma setningafræðiathugun villuleitarham í skeljaforskriftum – Part 2

Skeljarekning þýðir einfaldlega að rekja framkvæmd skipananna í skeljaskriftu. Til að kveikja á skeljarekningu, notaðu -x villuleitarvalkostinn.

Þetta beinir skelinni til að birta allar skipanir og rök þeirra á flugstöðinni þegar þær eru keyrðar.

Við munum nota sys_info.sh skeljaforskriftina hér að neðan, sem prentar stuttlega dagsetningu og tíma kerfisins þíns, fjölda notenda sem eru innskráðir og spenntur kerfisins. Hins vegar inniheldur það setningafræðivillur sem við þurfum að finna og leiðrétta.

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

Vistaðu skrána og gerðu handritið keyranlegt. Handritið er aðeins hægt að keyra með rót, notaðu því sudo skipunina til að keyra það eins og hér að neðan:

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

Af úttakinu hér að ofan getum við séð að skipun er fyrst framkvæmd áður en úttak hennar er skipt út fyrir gildi breytu.

Til dæmis var dagsetningin fyrst keyrð og úttak hennar var skipt út fyrir gildi breytunnar DATE.

Við getum framkvæmt setningafræðiathugun til að sýna aðeins setningafræðivillurnar sem hér segir:

$ sudo bash -n sys_info.sh 

Ef við skoðum skeljaforskriftina með gagnrýnum hætti munum við átta okkur á því að if setningin vantar lokaorð fi. Þess vegna skulum við bæta því við og nýja handritið ætti nú að líta út eins og hér að neðan:

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

Vistaðu skrána aftur og kallaðu á hana sem rót og athugaðu setningafræði:

$ sudo bash -n sys_info.sh

Niðurstaðan af setningafræðiathugun okkar hér að ofan sýnir enn að það er enn ein villan í handritinu okkar á línu 21. Þannig að við eigum enn eftir að leiðrétta setningafræði.

Ef við skoðum smáforritið greinandi einu sinni enn þá stafar villan í línu 21 af því að tvöfalda gæsalappið vantar (”) í síðustu bergmálsskipuninni í print_sys_info fallinu. .

Við munum bæta við tvöföldu gæsalöppunni í echo skipuninni og vista skrána. Breyta handritið er hér að neðan:

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

Athugaðu nú handritið einu sinni enn.

$ sudo bash -n sys_info.sh

Skipunin hér að ofan mun ekki framleiða neitt úttak vegna þess að handritið okkar er nú setningafræðilega rétt. Við getum líka rakið framkvæmd handritsins allt í annað sinn og það ætti að virka vel:

$ sudo bash -x sys_info.sh

Keyrðu nú handritið.

$ sudo ./sys_info.sh

Mikilvægi þess að rekja framkvæmd Shell Script

Skelja forskriftarrakning hjálpar okkur að bera kennsl á setningafræðivillur og það sem meira er, rökréttar villur. Tökum sem dæmi check_root aðgerðina í sys_info.sh skelforskriftinni, sem er ætlað að ákvarða hvort notandi sé rót eða ekki, þar sem aðeins er leyfilegt að keyra skriftuna af ofurnotandanum.

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

Galdurinn hér er stjórnað af if setningu tjáningunni [ \$UID\ -ne \$ROOT_ID\ ], þegar við notum ekki viðeigandi talnaoperator (-ne í þessu tilfelli, sem þýðir ekki jafn ), við endum með hugsanlega rökvillu.

Að því gefnu að við notuðum -eq ( þýðir jafnt og), myndi þetta leyfa hvaða kerfisnotanda sem og rótnotandanum að keyra skriftuna, þar af leiðandi rökrétt villa.

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

Athugið: Eins og við skoðuðum áður í upphafi þessarar seríu getur innbyggða skipunin sett skel virkjað villuleit í tilteknum hluta skeljahandrits.

Þess vegna mun línan hér að neðan hjálpa okkur að finna þessa rökréttu villu í aðgerðinni með því að rekja framkvæmd hennar:

Handritið með rökrænni villu:

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

Vistaðu skrána og kveiktu á handritinu, við getum séð að venjulegur kerfisnotandi getur keyrt handritið án sudo eins og í úttakinu hér að neðan. Þetta er vegna þess að gildi USER_ID er 100 sem er ekki jafnt og rót ROOT_ID sem er 0.

$ ./sys_info.sh

Jæja, það er það í bili, við erum komin að lokum skeljahandrita villuleitarröðarinnar, svareyðublaðið hér að neðan er hægt að nota til að svara öllum spurningum eða athugasemdum til okkar, varðandi þessa handbók eða alla 3-hluta röðina.