Kif Traċċa l-Eżekuzzjoni tal-Kmandi fi Shell Script b'Shell Tracing


F'dan l-artikolu tas-serje ta 'debugging tal-iskript tal-qoxra, aħna se nispjegaw it-tielet modalità ta' debugging tal-iskript tal-qoxra, jiġifieri t-traċċar tal-qoxra u nħarsu lejn xi eżempji biex nuru kif taħdem, u kif tista 'tintuża.

Il-parti ta 'qabel ta' din is-serje titfa' dawl ċar fuq iż-żewġ modi oħra ta 'debugging tal-iskript tal-qoxra: mod verbose u mod ta' verifika tas-sintassi b'eżempji faċli biex jinftiehmu ta 'kif tippermetti d-debugging tal-iskript tal-qoxra f'dawn il-modi.

  1. Kif Tippermetti l-Modalità ta' Debugging Shell Script f'Linux – Parti 1
  2. Kif Twettaq il-Modalità ta' Debugging tal-Iċċekkjar tas-Sintassi fi Shell Scripts – Parti 2

It-traċċar tal-qoxra sempliċiment ifisser it-traċċar tal-eżekuzzjoni tal-kmandi fi skript tal-qoxra. Biex taqleb it-traċċar tal-qoxra, uża l-għażla tad-debugging -x.

Dan jidderieġi lill-qoxra biex turi l-kmandi kollha u l-argumenti tagħhom fuq it-terminal hekk kif jiġu eżegwiti.

Aħna se nużaw l-iskript tal-shell sys_info.sh hawn taħt, li jistampa fil-qosor id-data u l-ħin tas-sistema tiegħek, in-numru ta’ utenti li illoggjaw u l-ħin tal-operat tas-sistema. Madankollu, fih żbalji sintassi li rridu nsibu u nikkoreġ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

Issejvja l-fajl u agħmel l-iskrittura eżekutibbli. L-iskript jista' jitmexxa biss bl-għerq, għalhekk uża l-kmand sudo biex tħaddem kif hawn taħt:

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

Mill-output ta 'hawn fuq, nistgħu nosservaw li, kmand jiġi l-ewwel esegwit qabel l-output tiegħu jiġi sostitwit bħala l-valur ta' varjabbli.

Pereżempju, id-data ġiet eżegwita għall-ewwel darba u l-output tagħha ġie sostitwit bħala l-valur tal-varjabbli DATA.

Nistgħu nwettqu verifika tas-sintassi biex nuru biss l-iżbalji tas-sintassi kif ġej:

$ sudo bash -n sys_info.sh 

Jekk inħarsu lejn l-iskript tal-qoxra b'mod kritiku, aħna nirrealizzaw li l-dikjarazzjoni if hija nieqsa kelma ta' l-għeluq fi. Għalhekk, ejjew inżiduha u l-iskrittura l-ġdida issa għandha tidher bħal hawn taħt:

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

Issalva l-fajl mill-ġdid u invokah bħala għerq u agħmel xi verifika tas-sintassi:

$ sudo bash -n sys_info.sh

Ir-riżultat ta 'l-operazzjoni tagħna ta' verifika tas-sintassi hawn fuq għadu juri li hemm bug wieħed aktar fl-iskrittura tagħna fuq il-linja 21. Għalhekk, għad għandna xi korrezzjoni tas-sintassi x'nagħmlu.

Jekk inħarsu mill-iskript b'mod analitiku darba oħra, l-iżball fuq il-linja 21 huwa dovut għal kwotazzjoni doppja ta' għeluq nieqsa (”) fl-aħħar kmand ta' eku ġewwa l-funzjoni print_sys_info .

Aħna se nżidu l-kwotazzjoni doppja tal-għeluq fil-kmand tal-eku u nissejvja l-fajl. L-iskript mibdul huwa hawn taħt:

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

Issa sintattikament iċċekkja l-iskrittura darba oħra.

$ sudo bash -n sys_info.sh

Il-kmand t'hawn fuq mhux se jipproduċi l-ebda output minħabba li l-iskrittura tagħna issa hija sintassikament korretta. Nistgħu wkoll intraċċaw l-eżekuzzjoni tal-iskript kollu għat-tieni darba u għandu jaħdem tajjeb:

$ sudo bash -x sys_info.sh

Issa mexxi l-iskript.

$ sudo ./sys_info.sh

Importanza ta 'Shell Script Eżekuzzjoni Traċċar

It-traċċar tal-iskrittura tal-shell jgħinna nidentifikaw l-iżbalji tas-sintassi u aktar importanti, l-iżbalji loġiċi. Ħu pereżempju l-funzjoni check_root fl-iskript tal-shell sys_info.sh, li hija maħsuba biex tiddetermina jekk utent huwiex root jew le, peress li l-iscript huwa permess biss li jiġi eżegwit mis-superutent.

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

Il-maġija hawnhekk hija kkontrollata mill-espressjoni if statement [ \$UID\ -ne \$ROOT_ID\ ], ladarba ma nużawx l-operatur numeriku adattat (-ne f'dan il-każ, li jfisser mhux ugwali ), nispiċċaw bi żball loġiku possibbli.

Jekk nassumu li użajna -eq ( tfisser ugwali għal), dan ikun jippermetti lil kwalunkwe utent tas-sistema kif ukoll lill-utent root biex imexxu l-iskript, għalhekk żball loġiku.

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

Nota: Kif ħares lejn qabel fil-bidu ta 'din is-serje, is-sett shell built-in kmand jista' jattiva d-debugging f'sezzjoni partikolari ta 'script shell.

Għalhekk, il-linja hawn taħt tgħinna nsibu dan l-iżball loġiku fil-funzjoni billi ntraċċaw l-eżekuzzjoni tagħha:

L-iskritt bi żball loġiku:

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

Issejvja l-fajl u tinvoka l-iskrittura, nistgħu naraw li utent tas-sistema regolari jista 'jmexxi l-iskrittura mingħajr sudo bħal fil-produzzjoni hawn taħt. Dan għaliex il-valur ta' USER_ID huwa 100 li mhuwiex ugwali għall-għeruq ROOT_ID li huwa 0.

$ ./sys_info.sh

Ukoll, dak huwa għalissa, wasalna fl-aħħar tas-serje ta 'debugging tal-iskript tal-qoxra, il-formola ta' rispons hawn taħt tista 'tintuża biex tindirizza xi mistoqsijiet jew feedback lilna, dwar din il-gwida jew is-serje sħiħa ta' 3 partijiet.