Cum se depanează un script bash?

How Debug Bash Script




Orice program trebuie să fie lipsit de erori înainte de a ajunge la consumatori. Dezvoltatorii de software încearcă din răsputeri să facă programele software fără erori. Dar este greu să faci un cod fără cusur atunci când există mii de linii. Depanarea este un proces continuu; ajută la detectarea imediată a erorilor, colectarea de informații valoroase despre cod și eliminarea bucăților de cod redundante.

Toate limbajele de programare au unele abordări comune și puține distincte pentru a găsi erori. De exemplu, programele de depanare pot fi utilizate pentru a elimina rapid erorile. În timp ce shell scripting-ul nu are un instrument special pentru depanarea codului. Această scriere este despre discutarea diferitelor tehnici de depanare care pot fi utilizate pentru a face scriptul bash fără erori. Înainte de a ne arunca cu capul în metode, să înțelegem de bază shell-urile și scripturile shell-urilor:







Ce este shell-ul în Linux?

Când porniți computerul, nucleul obține informații despre hardware-ul atașat și permite altor componente atașate să interacționeze. În afară de aceasta, gestionează memoria, procesorul și recunoaște orice periferic nou. Una peste alta, un nucleu este coloana vertebrală a oricărui sistem de operare. Dar v-ați gândit vreodată să interacționați direct cu nucleul, să-l comandați pentru a efectua o sarcină specifică? Este chiar posibil să faci asta? Absolut! Cu ajutorul unui shell, un program de calculator cu o interfață interactivă, oricine poate opera nucleul. Coaja permite oamenilor să interacționeze cu nucleul și să-l instruiască să îndeplinească orice sarcină.



În Unix, există două cochilii principale Shell Bourne și C coajă . Ambele tipuri au subcategoriile lor. Diferite tipuri de cochilii Bourne sunt Korn shell (ksh), Almquist shell (ash), Bourne again shell (bash), și Z shell (zsh) . În același timp, shell-ul C are propriile subcategorii cum ar fi C shell (csh) și Coajă TENEX C (tcsh) . După cum sa menționat mai sus, din toate scoicile, Bash (Bourne din nou shell) este cel mai utilizat shell și iese din cutie în multe distribuții Linux datorită eficienței și ușurinței sale de utilizare.



Bash este shell-ul implicit al multor distribuții Linux și este utilizat pe scară largă de milioane de utilizatori Linux. Este atât de divers și influent încât poate îndeplini fiecare sarcină pe care o îndepliniți de obicei în aplicații bazate pe GUI. Puteți edita fișiere, gestiona fișiere, vizualiza fotografii, asculta muzică, reda videoclipuri și multe altele.





Ce este un script Shell:

Pe măsură ce am învățat ideea de bază a shell-ului, acum să trecem la scriptarea shell-ului. Scriptul shell este un program de calculator care execută mai multe comenzi într-un shell care acționează ca un interpret pentru a îndeplini o anumită funcție. După cum sa discutat mai sus, există 2 tipuri speciale de cochilii. Cu toate acestea, acest ghid se concentrează pe shell Bourne Again (Bash).
Deci, ce este un script bash? În Linux, toate comenzile bash sunt stocate în / usr / bin și / bin dosare. De exemplu, ori de câte ori executați o comandă, bash caută dacă există sau nu în director. Comanda este executată dacă se găsește în directoare, altfel dă o eroare.

Ce zici de efectuarea unei sarcini care are nevoie de mai multe comenzi pentru a rula în terminal? În această situație specifică, scriptarea bash vă poate ajuta. Scriptarea Bash este o formă de scriptare shell care vă permite să creați programe pentru a rula mai multe comenzi bash pentru a efectua o anumită sarcină.



Ce sunt erorile în scripturile bash:

În timp ce lucrați cu scripturi bash sau cu orice alte limbaje de programare, întâmpinați multe erori. O eroare este o eroare sau o eroare în program care poate determina comportamentul incorect al programului.

Fiecare limbaj de programare are propria sa procedură pentru a găsi erori; în mod similar, bash are, de asemenea, multe opțiuni încorporate pentru a depana un program terminal.

Gestionarea erorilor și depanarea unui program nu este mai puțin decât o problemă. Este o slujbă care consumă mult timp și se poate agrava dacă nu sunteți conștienți de instrumentele potrivite pentru depanarea programului. Această scriere este un ghid complet despre depanarea scripturilor bash pentru a vă face scriptul fără erori. Deci, să începem:

Cum să depanați un script bash:

Când lucrați la proiecte mari de programare, întâlniți multe erori sau erori. Depanarea unui program poate fi uneori complicată. Programatorii folosesc de obicei instrumente de depanare, iar mulți editori de coduri ajută și la găsirea erorilor prin evidențierea sintaxei.

Există diverse instrumente în Linux pentru depanarea codurilor, de exemplu, GNU Debugger aka gdb. Instrumente precum GDB sunt utile pentru limbaje de programare care se compilează în binare. Deoarece bash este un limbaj interpretat simplu, nu este nevoie de instrumente grele pentru a-l depana.

Există diverse tehnici tradiționale de depanare a unui cod de script bash, iar una dintre ele este adăugarea Afirmații. Afirmațiile sunt condiții care sunt adăugate în programe pentru a verifica condiții specifice și a executa programul în consecință. Este o tehnică defensivă care ajută la găsirea erorilor și la testare. Puteți găsi multe instrumente care ajută la adăugarea de afirmații în scripturile bash.

Ei bine, adăugarea afirmațiilor este una dintre vechile tehnici tradiționale. Există seturi de steaguri / opțiuni disponibile în bash pentru a depana un script bash. Aceste opțiuni pot fi adăugate împreună cu shebang în scripturi sau adăugate în timpul executării programului în terminal. Subiectele pe care le vom aborda sunt enumerate mai jos:

  1. Cum se depanează scriptul bash activând verbos -v opțiune
  2. Cum se depanează scriptul bash folosind xtrace -x opțiune
  3. Cum se depanează scriptul bash folosind noexec -n opțiune
  4. Cum se identifică variabile nesetate în timp ce depanați scriptul bash
  5. Cum se depanează parte specifică a scriptului bash
  6. Cum se depanează un script bash folosind capcană comanda
  7. Cum se depanează un script bash prin eliminare arhivarea globului folosind -f opțiune
  8. Cum să combina opțiuni de depanare pentru a depana un script shell
  9. Cum să redirecționare depanare-raport la un dosar

Deci, să verificăm diferite tehnici în bash pentru a depana un script bash:

1. Cum se depanează scriptul bash activând opțiunea -v detaliată:

Una dintre cele mai simple abordări pentru depanarea scriptului bash este utilizarea -v opțiune, cunoscută și sub numele de verbose. Opțiunea poate fi adăugată cu shebang sau pusă în mod explicit cu numele fișierului script în timp ce o executați. Opțiunea detaliată va executa și imprima fiecare linie a codului ca proces de către interpret. Să o înțelegem cu un exemplu de script bash:

#! / bin / bash
aruncat „Introduceți numărul 1”
cititNumărul 1
aruncat „Introduceți numărul 2”
cititnumarul 2
dacă [ '$ number1' -gt '$ number2' ]
atunci
aruncat „Numărul1 este mai mare decât Numărul2”
elif [ '$ number1' -eq '$ number2' ]
atunci
aruncat „Numărul1 este egal cu Numărul2”
altceva
aruncat „Numărul2 este mai mare decât Numărul1”
fi

Codul de mai sus primește două numere de la utilizator și apoi efectuează câteva afirmații condiționale pentru a verifica dacă numărul este mai semnificativ, mai mic sau egal cu celălalt număr introdus. Deși orice editor de text poate fi folosit pentru scriptarea bash, eu folosesc editorul Vim. Vim este un editor puternic, bogat în funcții, care evidențiază sintaxa scripturilor bash și reduce șansele de erori de sintaxă. Dacă nu aveți editor Vim, obțineți-l executând comanda menționată mai jos:

$sudoaptinstalare am venit

Creați un fișier script bash utilizând:

$am venitb_script.sh

Dacă sunteți nou în editorul Vim, vă recomand să învățați cum se utilizează editorul vim înainte de a începe.

Acum, înapoi la script, executați scriptul folosind -v opțiune:

$bash -vb_script.sh

Se poate vedea în ieșirea de mai sus că fiecare linie a scriptului este tipărită în terminal pe măsură ce procesează de către interpret. Rețineți că scriptul va înceta să mai primească date de la utilizator și apoi va procesa următoarea linie a scriptului. După cum sa discutat mai sus că -v opțiunea poate fi plasată după shebang așa cum se arată în următoarele:

#! / bin / bash -v

În mod similar, steagul detaliat poate fi adăugat și în următoarea linie a shebang folosind a stabilit comanda:

#! / bin / bash
a stabilit -v

Oricare dintre metodele discutate mai sus poate activa detaliile.

2 Cum se depanează scriptul bash folosind opțiunea xtrace -x:

Urmărirea execuției, cunoscută și sub numele de xtrace, este o opțiune inteligentă și utilă de depanare, în special pentru a urmări erorile logice. Erorile logice sunt de obicei asociate cu variabile și comenzi. Pentru a verifica starea variabilei în timpul executării scriptului, folosim -X opțiune. Acum, din nou, rulați b_script.sh fișier cu -X steag:

$bash -Xb_script.sh

Ieșirea arată în mod explicit valoarea fiecărei variabile în timpul procesului de execuție. Din nou, -X poate fi folosit lângă shebang și după linia shebang folosind comanda set. Xtrace pune semnul + cu fiecare linie a scriptului.

3 Cum se depanează scriptul bash folosind opțiunea noexec -n:

Erorile de sintaxă sunt una dintre principalele cauze ale erorilor. Pentru a depana sintactic scriptul bash, îl folosim noexec (fără execuție) modul. Opțiunea utilizată pentru modul noexec este -n. Acesta va afișa numai erorile de sintaxă ale codului în loc să le execute. O abordare mult mai sigură pentru depanarea codului. Să executăm b_script.sh din nou cu -n opțiune:

$bash -nb_script.sh

Nu va exista executarea codului dacă nu există nicio eroare de sintaxă. Acum, să modificăm codul nostru:

#! / bin / bash

aruncat „Introduceți numărul 1”
cititNumărul 1
aruncat „Introduceți numărul 2”
cititnumarul 2
dacă [ '$ number1' -gt '$ number2' ]
atunci
aruncat „Numărul1 este mai mare decât Numărul2”
elif [ '$ number1' -eq '$ number2' ]
#atunci
aruncat „Numărul1 este egal cu Numărul2”
altceva
aruncat „Numărul2 este mai mare decât Numărul1”
fi

Comentez atunci după elif . Acum, cu -n executați b_script.sh scenariu:

$bash -nb_script.sh

După cum era anticipat, a identificat în mod clar eroarea și a afișat-o în terminal.

4 Cum se identifică variabilele nesetate în timpul depanării scriptului bash:

Efectuarea unei greșeli de scriere în timp ce scrieți un cod este obișnuită. Adesea, tastați greșit o variabilă, care nu permite executarea codului. Pentru a identifica o astfel de eroare, folosim -u opțiune. Să modificăm din nou codul:

#! / bin / bash
aruncat „Introduceți numărul 1”
cititNumărul 1
aruncat „Introduceți numărul 2”
cititnumarul 2
dacă [ '$ num1' -gt '$ number2' ]
atunci
aruncat „Numărul1 este mai mare decât Numărul2”
elif [ '$ number1' -eq '$ number2' ]
atunci
aruncat „Numărul1 este egal cu Numărul2”
altceva
aruncat „Numărul2 este mai mare decât Numărul1”
fi

In primul dacă declarație condiționată, am redenumit Numărul 1 variabilă la num1 . Acum num1 este o variabilă nesetată. Acum rulați scriptul:

$bash -ub_script.sh

Rezultatul a identificat și afișează în mod explicit numele unei variabile nesetate.

5. Cum se depanează partea specifică a scriptului bash:

Modul xtrace procesează fiecare linie a codului și dă ieșire. Cu toate acestea, găsirea erorilor într-un cod mare ar consuma mult timp dacă știm deja ce parte poate provoca eroarea. Din fericire, xtrace vă permite, de asemenea, să depanați o anumită porțiune din cod, care poate fi realizată folosind a stabilit comanda. Loc set -x la începutul porțiunii care trebuie depanată și apoi set + x la sfarsit. De exemplu, vreau să depan declarațiile condiționale ale b_script.sh , așa că voi anexa toate afirmațiile condiționale în set -x și set + x opțiuni așa cum se arată în codul de mai jos:

#! / bin / bash
aruncat „Introduceți numărul 1”
cititNumărul 1
aruncat „Introduceți numărul 2”
cititnumarul 2
a stabilit -X
dacă [ 'Numărul $' -gt '$ number2' ]
atunci
aruncat „Numărul1 este mai mare decât Numărul2”
elif [ '$ number1' -eq '$ number2' ]
atunci
aruncat „Numărul1 este egal cu Numărul2”
altceva
aruncat „Numărul2 este mai mare decât Numărul1”
fi
a stabilit+ x

Acum, rulați scriptul folosind bash b_script.sh .

Ieșirea depanează numai condițiile specificate.

6. Cum se depanează un script bash folosind comanda trap:

Dacă scriptul dvs. este complicat, atunci există și tehnici mai elaborative pentru depanare. Unul dintre ele este capcană comanda. The capcană comanda prinde semnalele și execută o comandă atunci când apare o anumită situație. Comanda poate fi un semnal sau o funcție. Am creat un alt script cu numele de sum_script.sh :

#! / bin / bash
capcană Linia „ecou” $ {LINENO}: primul număr este $ number1, al doilea număr este $ number2 și suma este $ sumă ”DEBUG
aruncat „Introduceți primul număr”
cititNumărul 1
aruncat „Introduceți al doilea număr”
cititnumarul 2
sumă= $[număr1 + număr2]
aruncat „suma estesuma $'

The capcană comanda cu DEBUG semnal afișează starea variabilelor Numărul 1 , numarul 2 și sumă după executarea fiecărei linii așa cum se arată în următoarea imagine de ieșire:

Blocurile galbene sunt spații goale, deoarece utilizatorul nu a introdus încă nicio intrare; aceste spații se vor umple pe măsură ce utilizatorul introduce valori. Această metodă este, de asemenea, destul de utilă în depanarea scripturilor bash.

7. Cum se depanează un script bash eliminând blocarea fișierelor folosind opțiunea -f:

Globarea fișierelor este un proces de găsire a fișierelor cu caractere wildcard, adică * și ? . În multe situații, nu este nevoie să extindeți fișierele în timpul depanării. În astfel de cazuri, puteți bloca blocarea fișierului folosind -f opțiune. Să o înțelegem cu un script fglobe_script.sh :

#! / bin / bash
aruncat „Afișați toate fișierele text.”
eu sunt *.txt

Codul de mai sus va afișa toate fișierele text din directorul curent, executați:

$bashfglobe_script.sh

Pentru a dezactiva blocarea fișierelor, utilizați -f opțiune:

$bash -ffglobe_script.sh

În mod similar, îl puteți folosi cu shebang și cu a stabilit comandă, de asemenea:

#! / bin / bash
aruncat „Afișați toate fișierele text.”
eu sunt *.txt
a stabilit -f
aruncat „Afișați toate fișierele text”
eu sunt *.txt
a stabilit+ f

Acum, fugi bash fglobe_script.sh:

Porțiunea inclusă cu set -f / set + f opțiunile nu au procesat comenzile cu caractere wildcard.

8. Cum se combină opțiunile de depanare pentru a depana scriptul shell:

Folosim o singură opțiune în tehnicile de depanare menționate mai sus, dar putem combina diverse opțiuni pentru o mai bună înțelegere. Să implementăm -X și -v opțiuni pentru sum_script.sh scenariu. Folosesc sum_script.sh scenariu.

#! / bin / bash
aruncat „Introduceți primul număr”
cititNumărul 1
aruncat „Introduceți al doilea număr”
cititnumarul 2
sumă= $[număr1 + număr2]
aruncat „suma estesuma $'

Acum executați:

$bash -xvsum_script.sh

Ambii -X și -v ieșirile sunt combinate, așa cum este afișat în imaginea de ieșire. În mod similar, putem combina și -u opțiune cu detaliu -v pentru detectarea erorilor. Înlocuiesc Numărul 1 variabilă cu pe unu în a șasea linie a scenariului:

#! / bin / bash
este$ number2șisumăestesuma $'' DEBUG
aruncat '
Introduceți primul număr'
citiți numărul 1
aruncat '
Introduceți al doilea număr'
citiți numărul 2
sumă = $ [num + număr2]
aruncat '
thesumăestesuma $'

Pentru a vizualiza ieșirea, rulați comanda menționată mai jos:

$bash -uvsum_script.sh

9. Cum se redirecționează raportul de depanare către un fișier:

Salvarea unui raport de depanare a unui script bash într-un fișier poate fi la îndemână în multe situații. Este un pic dificil, deoarece redirecționarea raportului de depanare către un fișier; folosim câteva variabile speciale. Să-l implementăm pe b_script.sh cod:

#! / bin / bash
exec 5>dubug_report.log
BASH_XTRACED=„5”
PS4='$ LINENO--'
aruncat „Introduceți numărul 1”
cititNumărul 1
aruncat „Introduceți numărul 2”
cititnumarul 2
dacă [ 'Numărul $' -gt '$ number2' ]
atunci
aruncat „Numărul1 este mai mare decât Numărul2”
elif [ '$ number1' -eq '$ number2' ]
atunci
aruncat „Numărul1 este egal cu Numărul2”
altceva
aruncat „Numărul2 este mai mare decât Numărul1”
fi

În a doua linie a codului, se poate vedea că redirecționăm ieșirea către un debug_report.log fișier folosind fișierul exec comandă cu descriptorul de fișiere 5 (FD5).

exec 5> debug_report.log: The exec comanda redirecționează tot ce se întâmplă în shell către un fișier debug_report.log.

BASH_XTRACEFD = 5: Este un variabilă bash specială și nu poate fi folosit în niciun alt shell. Trebuie să i se aloce un descriptor de fișier valid, iar bash va scrie ieșirea extrasă debug_report.log.

PS4 = ’$ LINENO– ‘: Este, de asemenea, o variabilă bash utilizată pentru a imprima numărul liniei în timp ce depanați folosind modul xtrace. Valoarea implicită a PS4 este + semn

Scriptul de mai sus generează un fișier jurnal numit debug_report.log, pentru ao citi, folosiți pisică comanda:

Concluzie:

Un cod plin de erori poate afecta performanța programului și poate dăuna hardware-ului. Depanarea este foarte importantă pentru fiecare program, deoarece face programul mai eficient. Găsirea erorilor existente și potențiale în timpul dezvoltării unui program poate împiedica programul dvs. să se comporte în mod neașteptat. Codurile mari necesită, de obicei, o depanare activă, sporind eficacitatea codului prin eliminarea bucăților de cod care consumă recurs.

Multe limbaje și medii de programare au propriile depanatoare. În scriptarea bash, pot fi implementate diverse tehnici pentru depanarea scriptului. Acest ghid s-a axat pe toate metodele care pot fi utilizate pentru a găsi erori în scripturile bash. Deci, ori de câte ori simțiți că scriptul dvs. bash nu se comportă așa cum vă așteptați, utilizați oricare dintre tehnicile menționate mai sus, dar modul xtrace (-x) este destul de util în majoritatea cazurilor.