Debugging a Bash Script

Oversikt

i denne opplæringen ser vi på de ulike teknikkene for å feilsøke Bash shell scripts. Bash-skallet gir ikke noen innebygd debugger. Det er imidlertid visse kommandoer og konstruksjoner som kan benyttes til dette formålet.

først diskuterer vi bruken av set-kommandoen for feilsøkingsskript. Etter det vil vi sjekke noen feilsøkingsspesifikke brukstilfeller ved hjelp av set og trap-kommandoene. Til slutt presenterer vi noen metoder for å feilsøke allerede kjørende skript.

Bash Feilsøkingsalternativer

feilsøkingsalternativene som er tilgjengelige I Bash-skallet, kan slås på og av på flere måter. Innenfor skript kan vi enten bruke set-kommandoen eller legge til et alternativ til shebang-linjen. En annen tilnærming er imidlertid å eksplisitt angi feilsøkingsalternativene i kommandolinjen mens du utfører skriptet. La oss dykke inn i diskusjonen.

2.1. Aktivering av detaljert Modus

Vi kan aktivere detaljert modus ved hjelp av-v-bryteren, som lar oss se hver kommando før den utføres.

for å demonstrere dette, la oss lage et eksempelskript:

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

dette skriptet kontrollerer om tallet som er oppgitt som inngang, er positivt.

Neste, la oss utføre skriptet vårt:

$ 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.

som vi kan legge merke til, skriver den ut hver linje av skriptet på terminalen før den behandles.

Vi kan også legge til-v-alternativet i shebang-linjen:

#! /bin/bash -v

Dette har samme effekt som å eksplisitt kalle et skript ved hjelp av bash-v. En annen ekvivalent er å aktivere modusen i et skript ved hjelp av set-kommandoen:

#! /bin/bashset -v

faktisk kan vi bruke en av måtene som er diskutert ovenfor for å aktivere de ulike bryterne som vi diskuterer fremover.

2.2. Syntakskontroll ved hjelp av Noexec-Modus

Det kan være situasjoner der vi kanskje vil validere skriptet syntaktisk før utførelsen. I så fall kan vi bruke noexec-modusen ved hjelp av-n-alternativet. Som et resultat Vil Bash lese kommandoene, men ikke utføre dem.

La oss utføre vår positive_check.sh skript i noexec-modus:

$ bash -n ./positive_check.sh

Dette gir en tom utgang siden det ikke er noen syntaksfeil. Nå vil vi endre skriptet litt og fjerne den da setningen:

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

Deretter validerer vi det syntaktisk med – n-alternativet:

$ 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'

som forventet kastet det en feil siden vi savnet den da setningen i if-tilstanden.

2.3. Feilsøking ved hjelp av xtrace-Modus

i forrige avsnitt testet vi skriptet for syntaksfeil. Men for å identifisere logiske feil, vil vi kanskje spore tilstanden til variabler og kommandoer under utførelsesprosessen. I slike tilfeller kan vi utføre skriptet i xtrace (execution trace) modus ved hjelp av-x alternativet.

denne modusen skriver ut spor av kommandoer for hver linje etter at de er utvidet, men før de utføres.

La oss utføre vår positive_check.sh skript i utførelsessporingsmodus:

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

Her kan vi se den utvidede versjonen av variabler på stdout før utførelse. Det er viktig å merke seg at linjene foran + – tegnet genereres av xtrace-modusen.

2.4. Identifisere Unset Variabler

La oss kjøre et eksperiment for å forstå standard oppførsel av unset variabler I Bash skript:

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

vi skal nå utføre skriptet ovenfor:

$ ./add_values.sh5

Som vi kan legge merke til, er det et problem: skriptet ble utført, men utgangen er logisk feil.

vi utfører nå skriptet med-u-alternativet:

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

Selvfølgelig er det mye mer klarhet nå!

skriptet kunne ikke kjøres siden variabelen tow_val ikke er definert. Vi hadde feilaktig skrevet two_val som tow_val mens du beregner totalen.

alternativet-u behandler unset variabler og parametere som en feil når du utfører parameterutvidelse. Følgelig får vi en feilmelding om at en variabel ikke er bundet til verdi mens du utfører skriptet med – u-alternativet

Bruk Saker Til Å Feilsøke Skallskript

Så langt så vi de forskjellige bryterne for feilsøkingsskript. Fremover ser vi på noen brukstilfeller og metoder for å implementere disse i shell-skript.

3.1. Kombinere Feilsøkingsalternativer

for å få bedre innsikt, kan vi videre kombinere de ulike alternativene til set-kommandoen.

La oss utføre vår add_values.sh skript med både-v og-u-alternativer aktivert:

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

Her, ved å aktivere den verbose modusen med-u-alternativet, kan vi enkelt identifisere setningen som utløser feilen.

på Samme måte kan vi kombinere verbose og xtrace-modus for å få mer presis feilsøkingsinformasjon.

som diskutert tidligere, viser-v-alternativet hver linje før den evalueres, og-x-alternativet viser hver linje etter at de er utvidet. Derfor kan vi kombinere både-x og-v alternativer for å se hvordan setninger ser ut før og etter variabelsubstitusjoner.

La Oss nå utføre vår positive_check.sh skript med-x og-v-modus aktivert:

$ 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.

vi kan observere at uttalelsene skrives ut på stdout før og etter variabel ekspansjon.

3.2. Debugging Bestemte Deler Av Skriptet

Debugging med-x eller-v opsjonsskallskript genererer en utgang for hver setning på stdout. Det kan imidlertid være situasjoner der vi kanskje vil redusere feilsøkingsinformasjon til bare bestemte deler av skriptet. Vi kan oppnå det ved å aktivere feilsøkingsmodus før kodeblokken starter, og senere tilbakestille den ved hjelp av set-kommandoen.

la oss sjekke det med et eksempel:

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

Her kan vi bare feilsøke if-tilstanden ved hjelp av set-setningen før tilstanden starter. Senere kunne vi tilbakestille xtrace-modusen etter at if-blokken slutter med set + x-kommandoen.

la oss validere det med utgangen:

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

Sikkert, utgangen ser mindre rotete ut.

3.3. Omdirigere Bare Feilsøkingsutgangen Til En Fil

i forrige avsnitt undersøkte vi hvordan vi kan begrense feilsøking til bare bestemte deler av skriptet. Følgelig kan vi begrense mengden utgang på stdout.

Videre kan vi omdirigere feilsøkingsinformasjonen til en annen fil og la skriptutgangen skrive ut på stdout.

la oss lage et annet skript for å sjekke det:

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

Først åpnet vi feilsøkingen.loggfil På File Descriptor (FD) 5 for skriving ved hjelp av exec-kommandoen.

da endret vi den spesielle skallvariabelen PS4. PS4-variabelen definerer spørringen som vises når vi utfører et skallskript i xtrace-modus. Standardverdien FOR PS4 er +. Vi endret verdien AV ps4-variabelen for å vise linjenumre i feilsøkingsprompten. For å oppnå dette brukte vi en annen spesiell skallvariabel LINENO.

Senere tildelte VI FD 5 Til Bash variabel BASH_XTRACEFD. I virkeligheten Vil Bash nå skrive xtrace-utgangen på FD5, dvs. debug.loggfil. La oss utføre skriptet:

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

som forventet er feilsøkingsutgangen ikke skrevet på terminalen. Selv om de første linjene, TIL FD 5 er tilordnet feilsøkingsutgang, ble skrevet ut.

i tillegg oppretter skriptet også en utdatafilfeilsøking.logg, som inneholder feilsøkingsinformasjonen:

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

Feilsøkingsskript Ved hjelp av felle

Vi kan bruke DEBUG trap-funksjonen Til Bash til å utføre en kommando gjentatte ganger. Kommandoen som er angitt i argumentene til trap-kommandoen, utføres før hver påfølgende setning i skriptet.

la oss illustrere dette med et eksempel:

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

i dette eksemplet angav vi echo-kommandoen for å skrive ut verdiene for variablene five_val, two_val og total. Deretter passerte vi denne echo-setningen til fellekommandoen med FEILSØKINGSSIGNALET. I praksis, før utførelsen av hver kommando i skriptet, blir verdiene av variabler skrevet ut.

la oss sjekke den genererte utgangen:

$ ./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

Debugging Allerede Kjører Skript

Så langt presenterte vi metoder for å feilsøke skallskript mens du utfører dem. Nå ser vi på måter å feilsøke et allerede kjørende skript på.

Vurder et eksempel som kjører skript som utfører søvn i en uendelig mens sløyfe:

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

Ved hjelp av pstree-kommandoen kan vi sjekke barneprosessene forked av skriptet vårt 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)

Vi brukte et ekstra alternativ-p for å skrive ut prosess-ider sammen med prosessnavnene. Derfor er vi i stand til å innse at skriptet venter på at barnprosessene (søvn) skal fullføres.

noen ganger vil vi kanskje se nærmere på operasjonene som utføres av våre prosesser. I slike tilfeller kan vi bruke strace-kommandoen til å spore Linux – systemanropene som pågår:

$ 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

Her brukte vi alternativet-p for å legge til prosess-id (372), dvs. vårt skript i utførelse. I tillegg brukte vi også-f-alternativet for å knytte til alle sine barnprosesser. Merk at strace-kommandoen genererer utdata for hvert systemkall. Derfor brukte vi-c-alternativet til å skrive ut et sammendrag av systemanropene ved opphør av strace.

Konklusjon

i denne opplæringen studerte vi flere teknikker for å feilsøke et skallskript.

i begynnelsen diskuterte vi de ulike alternativene for set-kommandoen og deres bruk for feilsøkingsskript. Etter det implementerte vi flere case-studier for å studere en kombinasjon av feilsøkingsalternativer. Ved siden av dette utforsket vi også måter å begrense feilsøkingsutgang og omdirigere den til en annen fil.

deretter presenterte Vi et brukstilfelle av fellekommandoen og FEILSØKINGSSIGNALET for feilsøkingsscenarier. Til slutt tilbød vi noen tilnærminger til feilsøking som allerede kjører skript.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.

Previous post Trosse His King: Hvordan Slaget Ved Arsuf Ble Vunnet
Next post Fugleperspektiv Fotografering Tips