Bash-komentosarjan virheenkorjaus

yleiskatsaus

tässä opetusohjelmassa tarkastelemme erilaisia tekniikoita bash-komentosarjan virheenkorjaukseen. Bash-komentotulkki ei tarjoa mitään sisäänrakennettua debuggeria. On kuitenkin olemassa tiettyjä komentoja ja konstruktioita, joita voidaan käyttää tähän tarkoitukseen.

ensin keskustellaan set-komennon käytöstä vianetsintäkomentoja varten. Sen jälkeen, tarkistamme muutamia virheenkorjaus erityisiä käyttötapauksia käyttäen set ja ansa komentoja. Lopuksi, esitämme joitakin menetelmiä debug jo käynnissä skriptejä.

Bash – vianetsintäasetukset

Bash-komentotulkin vianetsintäasetukset voidaan kytkeä päälle ja pois usealla tavalla. Skripteissä voimme joko käyttää set-komentoa tai lisätä vaihtoehdon shebang-riville. Toinen lähestymistapa on kuitenkin määrittää komentorivin virheenkorjausasetukset eksplisiittisesti skriptiä suoritettaessa. Sukelletaan keskusteluun.

2.1. Mahdollistaa verbose-tilan

voimme ottaa verbose-tilan käyttöön-V-kytkimellä, jonka avulla voimme tarkastella jokaista komentoa ennen sen suorittamista.

tämän osoittamiseksi luodaan näytekirjoitus:

#! /bin/bashread -p "Enter the input: " valzero_val=0if then echo "Positive number entered."else echo "The input value is not positive."fi

tämä skripti tarkistaa, onko syötteenä annettu numero positiivinen.

seuraavaksi suoritetaan skripti:

$ bash -v ./positive_check.sh#! /bin/bashread -p "Enter the input: " valEnter the input: -10zero_val=0if then echo "Positive number entered."else echo "The input value is not positive."fiThe input value is not positive.

kuten huomaamme, se tulostaa komentosarjan jokaisen rivin päätteeseen ennen sen käsittelyä.

shebang-riviin voidaan lisätä myös-v-vaihtoehto:

#! /bin/bash -v

tällä on sama vaikutus kuin komentosarjan kutsumisella bash-V: llä. toinen vastaava on ottaa komentosarjan tila käyttöön set-komennolla:

#! /bin/bashset -v

itse asiassa voimme käyttää jompaakumpaa edellä mainituista tavoista mahdollistaaksemme eri Kytkimet, joista keskustelemme vastedes.

2.2. Syntaksin tarkistus noexec-tilassa

voi olla tilanteita, joissa haluamme vahvistaa skriptin syntaktisesti ennen sen suorittamista. Jos näin on, Voimme käyttää noexec-tilaa-n-vaihtoehdon avulla. Tämän seurauksena Bash lukee komennot, mutta ei suorita niitä.

suoritetaan meidän positive_check.sh skripti noexec-tilassa:

$ bash -n ./positive_check.sh

tämä tuottaa tyhjän ulostulon, koska syntaksivirheitä ei ole. Nyt, me muokata skripti hieman ja poistaa sitten lausuma:

#! /bin/bashread -p "Enter the input: " valzero_val=0if echo "Positive number entered."else echo "The input value is not positive."fi

seuraavaksi vahvistamme sen syntaktisesti-n vaihtoehto:

$ bash -n ./positive_check_noexec.sh./positive_check_noexec.sh: line 6: syntax error near unexpected token `else'./positive_check_noexec.sh: line 6: ` else'

kuten odotettiin, se heitti virheen, koska jäimme silloin lausuman if kunnossa.

2.3. Virheenkorjaus käyttäen xtrace-tilaa

edellisessä osassa testasimme komentosarjan syntaksivirheiden varalta. Loogisten virheiden tunnistamiseksi Saatamme haluta jäljittää muuttujien ja komentojen tilaa suoritusprosessin aikana. Tällaisissa tapauksissa, voimme suorittaa script xtrace (execution trace) tilassa käyttäen-x vaihtoehto.

tämä tila tulostaa komennot jokaiselle riville niiden laajentamisen jälkeen, mutta ennen niiden suorittamista.

suoritetaan meidän positive_check.sh skripti suorituksen jäljitystilassa:

$ bash -x ./positive_check.sh+ read -p 'Enter the input: ' valEnter the input: 17+ zero_val=0+ ''+ echo 'Positive number entered.'Positive number entered.

Tässä näemme laajennetun version muuttujista stdoutissa ennen suoritusta. On tärkeää huomata, että + – merkin edeltävät viivat syntyvät xtrace-tilassa.

2.4. Identifying Unset Variables

Let ’ s run an experiment to understand the default bash scripts:

#! /bin/bashfive_val=5two_val=2total=$((five_val+tow_val))echo $total

suoritamme nyt yllä olevan komentosarjan:

$ ./add_values.sh5

kuten huomaamme, on ongelma: skripti suoritettu onnistuneesti, mutta tuloste on loogisesti virheellinen.

suoritamme nyt skriptin-u-valinnalla:

$ bash -u ./add_values.sh./add_values.sh: line 4: tow_val: unbound variable

varmasti, siellä on paljon enemmän selkeyttä nyt!

skriptiä ei voitu suorittaa, koska muuttujaa tow_val ei ole määritelty. Olimme virheellisesti kirjoittanut two_val kuin tow_val laskettaessa yhteensä.

– u-valitsin käsittelee irronneita muuttujia ja parametreja virheenä suoritettaessa parametrilaajennusta. Näin ollen saamme virheilmoituksen, että muuttuja ei ole sidottu arvoon suoritettaessa komentosarjaa-u-valinnalla

käytä tapauksia komentotulkin Debug-komentosarjoihin

tähän mennessä olemme nähneet erilaisia vianetsintäkomentosarjojen kytkimiä. Vastedes tarkastelemme joitakin käyttötapauksia ja menetelmiä näiden toteuttamiseksi komentotulkkikäsikirjoituksissa.

3.1. Yhdistämällä Vianetsintäasetukset

saat parempia oivalluksia, voimme edelleen yhdistää asetuskomennon eri vaihtoehtoja.

suoritetaan meidän add_values.sh skripti sekä-v että-u-valinnoilla:

$ bash -uv ./add_values.sh#! /bin/bashfive_val=5two_val=2total=$((five_val+tow_val))./add_values.sh: line 4: tow_val: unbound variable

tässä, ottamalla verbimuodon käyttöön-u-valinnalla, pystyimme helposti tunnistamaan virheen laukaisevan lausekkeen.

vastaavasti voimme yhdistää verbose-ja xtrace-tilan saadaksesi tarkempia debug-tietoja.

kuten aiemmin mainittiin,- V-vaihtoehto näyttää jokaisen rivin ennen sen arviointia ja-x-vaihtoehto näyttää jokaisen rivin sen jälkeen, kun niitä on laajennettu. Näin ollen voimme yhdistää sekä-x että-v-vaihtoehtoja nähdäksemme, miltä väittämät näyttävät ennen ja jälkeen muuttujan substituutioiden.

now, let ’ s execute our positive_check.sh skripti-X-ja-v-tilassa:

$ bash -xv ./positive_check.sh#! /bin/bashread -p "Enter the input: " val+ read -p 'Enter the input: ' valEnter the input: 5zero_val=0+ zero_val=0if then echo "Positive number entered."else echo "The input value is not positive."fi+ ''+ echo 'Positive number entered.'Positive number entered.

voimme todeta, että lauseet on painettu stdoutiin ennen ja jälkeen muuttujan laajennuksen.

3.2. Skriptin tiettyjen osien vianetsintä

Vianetsintä – X-tai-v-option komentotulkkikommenteilla luo tulosteen jokaiselle oletustulosteessa olevalle lauseelle. Voi kuitenkin olla tilanteita, joissa haluamme vähentää debug-tietoja vain tiettyihin komentosarjan osiin. Voimme saavuttaa tämän ottamalla debug-tilan käyttöön ennen koodilohkon käynnistymistä ja myöhemmin nollaamalla sen set-komennolla.

tarkistetaan se esimerkillä:

#! /bin/bashread -p "Enter the input: " valzero_val=0set -xif then echo "Positive number entered."else echo "The input value is not positive."fiset +xecho "Script Ended" 

tässä voisimme debugata vain if-ehdon käyttämällä asetuslausetta ennen ehdon alkamista. Myöhemmin, voisimme nollata xtrace-tilan if-lohkon päätyttyä käyttäen set + x-komentoa.

validoidaan se ulostulolla:

$ ./positive_debug.shEnter the input: 7+ ''+ echo 'Positive number entered.'Positive number entered.+ set +xScript Ended

varmasti, lähtö näyttää vähemmän sotkuinen.

3.3. Ohjaamalla vain Vianetsintätulosteen tiedostoon

edellisessä osassa tutkimme, miten voimme rajoittaa vianetsinnän vain tiettyihin skriptin osiin. Näin ollen voisimme rajoittaa tuotoksen stdout.

lisäksi voimme ohjata virheenjäljitystiedot toiseen tiedostoon ja antaa komentosarjan tulostua oletustulosteessa.

luodaan toinen skripti tarkistettavaksi:

#! /bin/bashexec 5> debug.log PS4='$LINENO: ' BASH_XTRACEFD="5" read -p "Enter the input: " valzero_val=0if then echo "Positive number entered."else echo "The input value is not positive."fi

ensin avasimme debugin.lokitiedosto File Descriptor (FD) 5: ssä Exec-komennolla kirjoittamista varten.

sitten vaihdoimme erikoiskuorimuuttujan PS4. PS4 muuttuja määrittelee kehote, joka saa näkyviin, kun suoritamme shell script xtrace-tilassa. PS4: n oletusarvo on +. Muutimme PS4-muuttujan arvoa näyttääksemme rivinumerot vianjäljityskehotteessa. Tämän saavuttamiseksi käytimme toista erityistä shell muuttuja LINENO.

myöhemmin osoitimme FD 5: n Bash-muuttujalle BASH_XTRACEFD. Käytännössä Bash kirjoittaa nyt xtrace-lähdön FD5: lle eli debugille.lokitiedosto. Suoritetaan skripti:

$ bash -x ./debug_logging.sh+ exec+ PS4='$LINENO: '4: BASH_XTRACEFD=5Enter the input: 2Positive number entered.

kuten odotettiin, vianetsintätulostetta ei kirjoiteta päätteeseen. Vaikka, ensimmäiset rivit, kunnes FD 5 on määritetty debug ulostulo tulostettiin.

lisäksi skripti luo myös tulostetiedoston debugin.loki, joka sisältää virheenjäljitystiedot:

$ cat debug.log5: read -p 'Enter the input: ' val6: zero_val=07: ''9: echo 'Positive number entered.'

virheenkorjaus skriptejä käyttäen trap

Voimme käyttää Bashin VIRHEENKORJAUSOMINAISUUTTA komennon toistamiseen. Trap-komennon argumenteissa määritetty komento suoritetaan ennen jokaista komentosarjan seuraavaa lausetta.

havainnollistetaan tätä esimerkillä:

#! /bin/bashtrap 'echo "Line- ${LINENO}: five_val=${five_val}, two_val=${two_val}, total=${total}" ' DEBUGfive_val=5two_val=2total=$((five_val+two_val))echo "Total is: $total"total=0 && echo "Resetting Total"

tässä esimerkissä määritimme echo-komennon, jolla tulostetaan muuttujien five_val, two_val ja total arvot. Tämän jälkeen siirsimme tämän echo-lausunnon trap-komentoon VIANETSINTÄSIGNAALIN kanssa. Itse asiassa ennen komentosarjan jokaisen komennon suorittamista muuttujien arvot tulostetaan.

tarkistetaan luotu tuloste:

$ ./trap_debug.shLine- 3: five_val=, two_val=, total=Line- 4: five_val=5, two_val=, total=Line- 5: five_val=5, two_val=2, total=Line- 6: five_val=5, two_val=2, total=7Total is: 7Line- 7: five_val=5, two_val=2, total=7Line- 7: five_val=5, two_val=2, total=0Resetting Total

Vianetsintä jo käynnissä olevat skriptit

tähän mennessä esittelimme menetelmiä, joilla voit debugata komentotulkin skriptejä niiden suorittamisen aikana. Nyt, tarkastelemme tapoja debug jo käynnissä skripti.

harkitse sample running-skriptiä, joka suorittaa unen äärettömässä silmukassa:

#! /bin/bashwhile :do sleep 10 & echo "Sleeping for 4 seconds.." sleep 4done

pstree-komennon avulla voimme tarkistaa komentosarjamme haaroittamat lapsiprosessit sleep.sh:

$ pstree -pinit(1)─┬─init(148)───bash(149)───sleep.sh(372)─┬─sleep(422) │ ├─sleep(424) │ └─sleep(425) ├─init(213)───bash(214)───pstree(426) └─{init}(7)

käytimme lisävaihtoehtoa-p tulostaaksemme prosessin tunnukset sekä prosessin nimet. Näin ollen voimme ymmärtää, että käsikirjoitus odottaa lapsen prosesseja (Uni) loppuun.

joskus Saatamme haluta tarkastella lähemmin prosessiemme suorittamia toimintoja. Tällaisissa tapauksissa, voimme käyttää strace komento jäljittää Linux-järjestelmän puhelut käynnissä:

$ sudo strace -c -fp 372strace: Process 372 attachedstrace: Process 789 attachedstrace: Process 790 attached^Cstrace: Process 372 detachedstrace: Process 789 detachedstrace: Process 790 detached% time seconds usecs/call calls errors syscall------ ----------- ----------- --------- --------- ----------------100.00 0.015625 5208 3 wait4 0.00 0.000000 0 6 read 0.00 0.000000 0 1 write 0.00 0.000000 0 39 close 0.00 0.000000 0 36 fstat 0.00 0.000000 0 38 mmap 0.00 0.000000 0 8 mprotect 0.00 0.000000 0 2 munmap 0.00 0.000000 0 6 brk 0.00 0.000000 0 16 rt_sigaction 0.00 0.000000 0 20 rt_sigprocmask 0.00 0.000000 0 1 rt_sigreturn 0.00 0.000000 0 6 6 access 0.00 0.000000 0 1 dup2 0.00 0.000000 0 2 getpid 0.00 0.000000 0 2 clone 0.00 0.000000 0 2 execve 0.00 0.000000 0 2 arch_prctl 0.00 0.000000 0 37 openat------ ----------- ----------- --------- --------- ----------------100.00 0.015625 228 6 total

tässä käytimme vaihtoehtoa-p liittää prosessin tunnus (372) eli meidän skripti suorituksessa. Lisäksi käytimme-f-vaihtoehtoa liittääksemme sen kaikkiin lapsiprosesseihin. Huomaa, että, strace komento luo lähtö jokaisen järjestelmän puhelun. Siksi käytimme-C-vaihtoehtoa tulostaaksemme yhteenvedon järjestelmäpuheluista stracen päättyessä.

Conclusion

tässä opetusohjelmassa tutkimme useita tekniikoita komentotulkin komentosarjan debugoimiseksi.

alussa keskustelimme set-komennon eri vaihtoehdoista ja niiden käytöstä virheenkorjauskomentoihin. Sen jälkeen toteutimme useita tapaustutkimuksia, joissa tutkittiin virheenkorjausvaihtoehtojen yhdistelmää. Tämän ohella tutkimme myös tapoja rajoittaa debug-tulostetta ja ohjata se toiseen tiedostoon.

seuraavaksi esitimme trap-komennon ja DEBUG-signaalin käyttötapauksen virheenkorjausskenaarioita varten. Lopuksi, tarjosimme muutamia lähestymistapoja debug jo käynnissä skriptejä.

Vastaa

Sähköpostiosoitettasi ei julkaista.

Previous post Kuninkaan uhmaaminen: kuinka Arsufin taistelu voitettiin
Next post Birds Eye view Photography Tips