Kuidas siluda bash -skripti?

How Debug Bash Script




Iga programm peab enne tarbijateni jõudmist olema vigadeta. Tarkvaraarendajad teevad kõik endast oleneva, et muuta tarkvaraprogrammid veadeta. Kuid tuhandeid ridu on raske veatuks muuta. Silumine on pidev protsess; see aitab viivitamatult vigu avastada, koodi kohta väärtuslikku teavet koguda ja üleliigseid kooditükke kõrvaldada.

Kõigil programmeerimiskeeltel on vigade leidmiseks mõned ühised ja vähesed erinevad lähenemisviisid. Näiteks saab vigade kiireks kõrvaldamiseks kasutada silumisprogramme. Kusjuures shelliskriptidel pole koodi silumiseks mingit spetsiaalset tööriista. See kirjutis käsitleb erinevaid silumistehnikaid, mida saab kasutada bash-skripti veatuks muutmiseks. Enne meetoditesse sukeldumist mõistame põhiliselt kestasid ja kestade skripte:







Mis on kest Linuxis?

Arvuti käivitamisel saab kernel teavet lisatud riistvara kohta ja võimaldab teistel ühendatud komponentidel suhelda. Peale selle haldab see mälu, protsessorit ja tunneb ära kõik uued välisseadmed. Kokkuvõttes on kernel iga operatsioonisüsteemi selgroog. Kuid kas olete kunagi mõelnud otse kerneliga suhelda, käskida seda teatud ülesande täitmiseks? Kas seda on üldse võimalik teostada? Absoluutselt! Kesta, interaktiivse liidesega arvutiprogrammi abil saab kernelit juhtida igaüks. Kest võimaldab inimestel tuumaga suhelda ja juhendab seda mis tahes ülesannet täitma.



Unixis on kaks peamist kesta Bourne kest ja C kest . Mõlemal tüübil on oma alamkategooriad. Bourne kestad on erinevat tüüpi Korn kest (ksh), Almquisti kest (tuhk), Bourne jälle kest (bash), ja Z kest (zsh) . Samal ajal on C kestal oma alamkategooriad nagu C kest (csh) ja TENEX C kest (tk) . Nagu eespool mainitud, on kõikidest kestadest Bash (Bourne'i kest) on kõige laialdasemalt kasutatav kest ja tuleb paljudest Linuxi distributsioonidest karbist välja tänu oma tõhususele ja kasutajasõbralikkusele.



Bash on paljude Linuxi distributsioonide vaikekest ja seda kasutavad laialdaselt miljonid Linuxi kasutajad. See on nii mitmekesine ja mõjukas, et suudab täita kõiki ülesandeid, mida tavaliselt GUI-põhistes rakendustes täidate. Saate redigeerida faile, hallata faile, vaadata fotosid, kuulata muusikat, esitada videoid ja palju muud.





Mis on Shelli skript:

Nagu oleme õppinud kesta põhiideed, liigume nüüd shelliskriptimise poole. Kesta skript on arvutiprogramm, mis täidab kestas mitu käsku, mis toimib tõlgina teatud funktsiooni täitmiseks. Nagu eespool arutatud, on kahte tüüpi kestasid. Käesolev juhend keskendub aga Bourne Again kestale (Bash).
Mis on bash -skript? Linuxis salvestatakse kõik bash -käsud /usr /bin ja /bin kaustad. Näiteks otsib bash alati käsu käivitamisel, kas see on kataloogis olemas või mitte. Käsk käivitatakse, kui see leiab kataloogidest, annab muu vea.

Kuidas oleks teha ülesanne, mis vajab terminalis käivitamiseks mitut käsku? Selles konkreetses olukorras võib teid aidata bash -skriptimine. Bash -skriptimine on shelliskriptimise vorm, mis võimaldab teil panna programmid konkreetse ülesande täitmiseks käivitama mitu bash -käsku.



Mis on bash -skriptimise vead:

Bash -skriptide või mõne muu programmeerimiskeelega töötades ilmneb palju vigu. Viga on programmi viga või viga, mis võib põhjustada programmi ebaõige käitumise.

Igal programmeerimiskeelel on vigade leidmiseks oma protseduur; sarnaselt on bashil ka palju sisseehitatud võimalusi terminaliprogrammi silumiseks.

Vigade haldamine ja programmi silumine on vähemalt tülikas. See on aeganõudev töö ja võib halveneda, kui te ei tea õigeid tööriistu oma programmi silumiseks. See üleskirjutus on täielik juhend bash-skriptide silumise kohta, et muuta skript veatuks. Nii et alustame:

Bash -skripti silumine:

Kui töötate suurte programmeerimisprojektide kallal, ilmneb teil palju vigu või vigu. Programmi silumine võib mõnikord olla keeruline. Programmeerijad kasutavad tavaliselt silumistööriistu ja paljud kooditoimetajad aitavad ka vigade leidmisel, tõstes esile süntaksi.

Linuxis on koodide silumiseks erinevaid tööriistu, näiteks GNU Debugger aka gdb. Sellised tööriistad nagu GDB on abiks programmeerimiskeelte jaoks, mis kompileeritakse binaarfailideks. Kuna bash on lihtne tõlgendatav keel, pole selle silumiseks vaja raskeid tööriistu.

Bash -skripti koodi silumiseks on erinevaid traditsioonilisi tehnikaid ja üks neist on lisamine Väited. Väited on tingimused, mis lisatakse programmidesse, et kontrollida konkreetseid tingimusi ja programmi vastavalt täita. See on kaitsemeetod, mis aitab leida vigu ja testida. Leiad palju tööriistad mis aitavad lisada väiteid bash -skriptidesse.

Väidete lisamine on üks vana traditsiooniline tehnika. Bashis on skripti silumiseks saadaval lipukomplekte/valikuid. Neid suvandeid saab lisada koos shebangiga skriptidesse või lisada programmi terminali käivitamisel. Teemad, mida me kavatseme käsitleda, on loetletud allpool:

  1. Kuidas siluda bash -skripti lubades paljusõnaline -v valik
  2. Kuidas siluda bash -skripti kasutades xtrace -x valik
  3. Kuidas siluda bash -skripti kasutades noexec -n valik
  4. Kuidas tuvastada seadistamata muutujad bash -skripti silumise ajal
  5. Kuidas siluda konkreetne osa bashi skriptist
  6. Kuidas siluda bash -skripti, kasutades lõks käsk
  7. Kuidas siluda bash -skripti, kõrvaldades selle faili haaramine kasutades -f valik
  8. Kuidas kombineerima silumissuvandid shelliskripti silumiseks
  9. Kuidas silumisraporti ümbersuunamine faili

Nii et kontrollime bashi skripti silumiseks erinevaid bash -tehnikaid:

1. Kuidas siluda bash -skripti, lubades sõna -v -suvandi:

Üks lihtsamaid viise bash -skripti silumiseks on -v valik, tuntud ka kui paljusõnaline. Selle suvandi saab lisada shebangiga või selgesõnaliselt skriptifaili nimega selle täitmise ajal. Paljusõnaline suvand käivitab ja prindib tõlgi protsessina koodi iga rea. Mõistame seda bash -skripti näitega:

#! /bin/bash
viskas välja 'Sisesta number1'
loenumber1
viskas välja 'Sisesta number2'
loenumber2
kui [ '$ number1' -gt '$ number2' ]
siis
viskas välja 'Number1 on suurem kui arv2'
elif [ '$ number1' -ekv '$ number2' ]
siis
viskas välja 'Number1 on võrdne arvuga 2'
muidu
viskas välja 'Number2 on suurem kui number1'
olla

Ülaltoodud kood võtab kasutajalt kaks numbrit ja täidab seejärel mõned tingimuslaused, et kontrollida, kas number on olulisem, väiksem või võrdne teise sisestatud numbriga. Kuigi bash -skriptimiseks saab kasutada mis tahes tekstiredaktorit, kasutan ma Vim -redaktorit. Vim on võimas ja funktsioonirikas redaktor, mis tõstab esile bash-skriptide süntaksi ja vähendab süntaksivigade tõenäosust. Kui teil pole Vim -redaktorit, saate selle, käivitades allpool nimetatud käsu:

$sudoasjakohanepaigaldada ma tulin

Looge bash -skriptifail, kasutades järgmist.

$ma tulinb_script.sh

Kui te pole Vimi redigeerija uus, soovitan teil õppida kuidas kasutada vim -redaktorit enne jätkamist.

Nüüd skripti juurde tagasi käivitage skript, kasutades -v valik:

$lööma -vb_script.sh

Ülaltoodud väljundist on näha, et skripti iga rida trükitakse terminalis, kui tõlk neid töötleb. Pange tähele, et skript lõpetab kasutaja sisendi võtmise ja seejärel töötleb skripti järgmist rida. Nagu eespool arutatud, on -v valiku saab paigutada pärast shebangi, nagu on näidatud järgmiselt:

#! / bin / bash -v

Sarnaselt saab paljusõnalise lipu lisada ka shebangi järgmisele reale, kasutades seatud käsk:

#! /bin/bash
seatud -v

Kõik ülalkirjeldatud meetodid võivad paljusõnalise lubada.

2 Kuidas siluda bash -skripti, kasutades valikut xtrace -x:

Käivitusjälg, tuntud ka kui xtrace, on nutikas ja kasulik silumisvõimalus, eriti loogiliste vigade jälgimiseks. Loogilised vead on tavaliselt seotud muutujate ja käskudega. Muutuja oleku kontrollimiseks skripti täitmise ajal kasutame -x valik. Nüüd käivitage uuesti b_script.sh fail koos -x lipp:

$lööma -xb_script.sh

Väljund näitab selgesõnaliselt iga muutuja väärtust täitmisprotsessi ajal. Jällegi, -x saab kasutada shebangi kõrval ja pärast shebangi rida, kasutades käsku set. Xtrace paneb skripti iga rea ​​juurde + märgi.

3 Kuidas siluda bash -skripti, kasutades valikut noexec -n:

Süntaksivead on üks vea esmaseid põhjusi. Bash -skripti süntaktiliseks silumiseks kasutame noexec (ilma täitmiseta) režiim. Noexec -režiimi jaoks kasutatav valik on -n. See kuvab koodi täitmise asemel ainult koodi süntaksivigu. Palju turvalisem viis koodi silumiseks. Teostame b_script.sh uuesti koos -n valik:

$lööma -nb_script.sh

Süntaksiviga puudumisel koodi ei käivitata. Nüüd muudame oma koodi:

#! /bin/bash

viskas välja 'Sisesta number1'
loenumber1
viskas välja 'Sisesta number2'
loenumber2
kui [ '$ number1' -gt '$ number2' ]
siis
viskas välja 'Number1 on suurem kui arv2'
elif [ '$ number1' -ekv '$ number2' ]
#siis
viskas välja 'Number1 on võrdne arvuga 2'
muidu
viskas välja 'Number2 on suurem kui number1'
olla

Ma kommenteerin siis pärast elif . Nüüd, täitke -n b_script.sh skript:

$lööma -nb_script.sh

Nagu oodatud, tuvastas ta vea selgelt ja kuvas selle terminalis.

4 Kuidas tuvastamata muutujaid bash -skripti silumise ajal tuvastada:

Tippviga tegemine koodi kirjutamise ajal on tavaline. Sageli sisestate muutuja valesti, mis ei lase koodil käivituda. Sellise vea tuvastamiseks kasutame -u valik. Muudame koodi uuesti:

#! /bin/bash
viskas välja 'Sisesta number1'
loenumber1
viskas välja 'Sisesta number2'
loenumber2
kui [ '$ num1' -gt '$ number2' ]
siis
viskas välja 'Number1 on suurem kui arv2'
elif [ '$ number1' -ekv '$ number2' ]
siis
viskas välja 'Number1 on võrdne arvuga 2'
muidu
viskas välja 'Number2 on suurem kui number1'
olla

Esimesel kui tingimusliku avalduse, nimetasin ümber number1 muutuja kuni num1 . Nüüd num1 on määramata muutuja. Nüüd käivitage skript:

$lööma -ub_script.sh

Väljund on tuvastanud ja kuvab selgesõnaliselt muutmata muutuja nime.

5. Kuidas siluda bash -skripti konkreetset osa:

Xtrace -režiim töötleb iga koodi rida ja annab väljundi. Vigade leidmine suures koodis oleks aga aeganõudev, kui me juba teame, milline osa tõrke võib põhjustada. Õnneks võimaldab xtrace ka siluda koodi teatud osa, mida saab teha, kasutades seatud käsk. Koht komplekt -x selle osa alguses, mis vajab silumist ja seejärel komplekt +x lõpus. Näiteks tahan siluda tingimuslauseid b_script.sh , seega lisan kõik tingimuslikud avaldused komplekt -x ja komplekt +x valikud, nagu on näidatud allolevas koodis:

#! /bin/bash
viskas välja 'Sisesta number1'
loenumber1
viskas välja 'Sisesta number2'
loenumber2
seatud -x
kui [ '$ number' -gt '$ number2' ]
siis
viskas välja 'Number1 on suurem kui arv2'
elif [ '$ number1' -ekv '$ number2' ]
siis
viskas välja 'Number1 on võrdne arvuga 2'
muidu
viskas välja 'Number2 on suurem kui number1'
olla
seatud+ x

Nüüd käivitage skript, kasutades bash b_script.sh .

Väljund silub ainult siis, kui tingimused on määratud.

6. Kuidas siluda bash -skripti, kasutades käsku trap:

Kui teie skript on keeruline, on silumiseks ka täpsemaid tehnikaid. Üks neist on lõks käsk. The lõks käsk püüab signaalid kinni ja täidab konkreetse olukorra korral käsu. Käsk võib olla signaal või funktsioon. Olen loonud teise skripti nimega sum_script.sh :

#! /bin/bash
lõks 'echo' rida $ {LINENO}: esimene number on $ number1, teine ​​number $ number2 ja summa on $ summa ''DEBUG
viskas välja 'Sisesta esimene number'
loenumber1
viskas välja 'Sisesta teine ​​number'
loenumber2
summa= $[number1 + number2]
viskas välja 'summa on$ summa'

The lõks käsu abil DEBUG signaal näitab muutujate olekut number1 , number2 ja summa pärast iga rea ​​täitmist, nagu on näidatud järgmisel väljundpildil:

Kollased plokid on tühjad kohad, kuna kasutaja pole veel sisendit sisestanud; need tühikud täituvad, kui kasutaja väärtusi sisestab. See meetod on ka bash -skriptide silumisel üsna kasulik.

7. Kuidas siluda bash -skripti, kõrvaldades faili liigutamise, kasutades valikut -f:

Failide liigutamine on protsess, mis võimaldab leida metamärkidega faile, st * ja ? . Paljudes olukordades ei pea te silumise ajal faile laiendama. Sellistel juhtudel saate faili liigutamise blokeerida, kasutades -f valik. Mõistame seda skripti abil fglobe_script.sh :

#! /bin/bash
viskas välja 'Kuva kõik tekstifailid.'
ls *.txt

Ülaltoodud kood kuvab kõik praeguse kataloogi tekstifailid, käivitage:

$löömafglobe_script.sh

Failide liigutamise väljalülitamiseks kasutage -f valik:

$lööma -ffglobe_script.sh

Samamoodi saate seda kasutada koos shebangi ja seatud käsk ka:

#! /bin/bash
viskas välja 'Kuva kõik tekstifailid.'
ls *.txt
seatud -f
viskas välja „Kuva kõik tekstifailid”
ls *.txt
seatud+f

Nüüd jookse bash fglobe_script.sh:

Osa on suletud komplekt -f/set +f valikud ei töötlenud metamärkidega käske.

8. Kuidas silumisvalikuid kombineerida shelliskripti silumisega:

Ülalmainitud silumistehnikates kasutame ainult ühte võimalust, kuid parema mõistmise huvides saame kombineerida erinevaid võimalusi. Viime ellu -x ja -v võimalusi sum_script.sh skript. Ma kasutan sum_script.sh skript.

#! /bin/bash
viskas välja 'Sisesta esimene number'
loenumber1
viskas välja 'Sisesta teine ​​number'
loenumber2
summa= $[number1 + number2]
viskas välja 'summa on$ summa'

Nüüd käivitage:

$lööma -xvsum_script.sh

Mõlemad -x ja -v väljundid on kombineeritud, nagu on näidatud väljundpildil. Samamoodi saame ühendada ka -u vea tuvastamise võimalus koos sõnaga -v. Ma asendan number1 muutuja koos ühe peale stsenaariumi kuuendal real:

#! /bin/bash
on$ number2jasummaon$ summa'' DEBUG
viskas välja '
Sisestage esimene number'
loe number 1
viskas välja '
Sisestage teine ​​number'
loe number 2
summa = $ [number + number2]
viskas välja '
thesummaon$ summa'

Väljundi vaatamiseks käivitage alltoodud käsk:

$lööma -uvsum_script.sh

9. Kuidas silumisaruannet faili suunata:

Bash -skripti silumisaruande salvestamine faili võib olla kasulik paljudes olukordades. See on natuke keeruline, kuna silumisraporti faili suunata; kasutame erilisi muutujaid. Rakendame selle edasi b_script.sh kood:

#! /bin/bash
täideviija 5>dubug_report.log
BASH_XTRACED='5'
PS4='$ LINENO-'
viskas välja 'Sisesta number1'
loenumber1
viskas välja 'Sisesta number2'
loenumber2
kui [ '$ number' -gt '$ number2' ]
siis
viskas välja 'Number1 on suurem kui arv2'
elif [ '$ number1' -ekv '$ number2' ]
siis
viskas välja 'Number1 on võrdne arvuga 2'
muidu
viskas välja 'Number2 on suurem kui number1'
olla

Koodi teisel real on näha, et suuname väljundi a -le debug_report.log faili kasutades täideviija käsk failikirjeldusega 5 (FD5).

exec 5> debug_report.log: The täideviija käsk suunab kõik kestas toimuva faili ümber debug_report.log.

BASH_XTRACEFD = 5: See on konkreetne bash muutuja ja seda ei saa kasutada üheski teises kestas. Sellele tuleb määrata kehtiv failikirjeldus ja bash kirjutab ekstraheeritud väljundi debug_report.log.

PS4 = $ LINENO– ': See on ka bash -muutuja, mida kasutatakse rea numbri printimiseks, kui siluda, kasutades xtrace -režiimi. PS4 vaikeväärtus on + märk

Ülaltoodud skript loob logifaili nimega debug_report.log, selle lugemiseks kasutage kass käsk:

Järeldus:

Vigu täis kood võib mõjutada programmi jõudlust ja kahjustada ka riistvara. Silumine on iga programmi jaoks väga oluline, kuna see muudab programmi tõhusamaks. Olemasolevate ja võimalike vigade leidmine programmi arendamise ajal võib takistada teie programmi ootamatut käitumist. Suured koodid vajavad tavaliselt aktiivset silumist, suurendades koodi tõhusust, kõrvaldades tagasivõtmise tarbivad kooditükid.

Paljudel programmeerimiskeeltel ja -keskkondadel on oma kaas silurid. Bash -skriptimisel saab skripti silumiseks rakendada erinevaid tehnikaid. See juhend keskendus põhjalikult kõigile meetoditele, mida saab kasutada bash -skriptides vigade leidmiseks. Nii et kui tunnete, et teie bash-skript ei tööta ootuspäraselt, kasutage mõnda ülalnimetatud tehnikat, kuid xtrace-režiim (-x) on enamikul juhtudel üsna kasulik.