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.
- Kif Tippermetti l-Modalità ta' Debugging Shell Script f'Linux – Parti 1
- 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.