Hoe een bash-script debuggen?

How Debug Bash Script




Elk programma moet vrij zijn van fouten voordat het de consument bereikt. Softwareontwikkelaars doen hun best om de softwareprogramma's bugvrij te maken. Maar het is moeilijk om een ​​code foutloos te maken als er duizenden regels zijn. Debuggen is een continu proces; het helpt bij het onmiddellijk detecteren van fouten, het verzamelen van waardevolle informatie over code en het elimineren van overbodige codebrokken.

Alle programmeertalen hebben een aantal gemeenschappelijke en weinig verschillende benaderingen om bugs te vinden. Zo kunnen foutopsporingsprogramma's worden gebruikt om fouten snel te verwijderen. Terwijl shellscripting geen specifieke tool heeft om de code te debuggen. Dit artikel gaat over het bespreken van verschillende debugging-technieken die kunnen worden gebruikt om het bash-script foutloos te maken. Voordat we in de methoden duiken, laten we eerst een basiskennis hebben van shells en shellscripting:







Wat is de shell in Linux?

Wanneer u uw computer opstart, krijgt de kernel informatie over de aangesloten hardware en staat andere aangesloten componenten toe om te interageren. Afgezien daarvan beheert het geheugen, CPU en herkent het elk nieuw randapparaat. Al met al is een kernel de ruggengraat van elk besturingssysteem. Maar heb je er ooit aan gedacht om rechtstreeks met de kernel te interageren, hem opdracht te geven een specifieke taak uit te voeren? Is het zelfs praktisch om dat te doen? Absoluut! Met behulp van een shell, een computerprogramma met een interactieve interface, kan iedereen de kernel bedienen. De shell stelt mensen in staat om te communiceren met de kernel en deze opdracht te geven om elke taak uit te voeren.



In Unix zijn er twee hoofdschillen: Bourne schelp en C-schaal . Beide typen hebben hun subcategorieën. Verschillende soorten Bourne-schelpen zijn: Korn shell (ksh), Almquist shell (ash), Bourne weer shell (bash), en Z-schaal (zsh) . Tegelijkertijd heeft de C-shell zijn eigen subcategorieën zoals: C-schaal (csh) en TENEX C-schaal (tcsh) . Zoals hierboven vermeld, uit alle schelpen, Bash (Bourne opnieuw shell) is de meest gebruikte shell en komt uit de doos in veel Linux-distributies vanwege zijn efficiëntie en gebruiksvriendelijkheid.



Bash is de standaardshell van veel Linux-distributies en wordt op grote schaal gebruikt door miljoenen Linux-gebruikers. Het is zo divers en invloedrijk dat het elke taak kan uitvoeren die u gewoonlijk uitvoert in op GUI gebaseerde toepassingen. U kunt bestanden bewerken, bestanden beheren, foto's bekijken, naar muziek luisteren, video's afspelen en nog veel meer.





Wat is een Shell-script:

Nu we het basisidee van shell hebben geleerd, gaan we nu over op shell-scripting. Het shellscript is een computerprogramma dat meerdere commando's uitvoert in een shell die fungeert als een interpreter om een ​​specifieke functie uit te voeren. Zoals hierboven besproken, zijn er 2 specifieke soorten schelpen. Deze gids richt zich echter op de Bourne Again-shell (Bash).
Dus wat is een bash-script? In Linux worden alle bash-commando's opgeslagen in /usr/bin en /bin mappen. Wanneer u bijvoorbeeld een opdracht uitvoert, zoekt bash of deze in de map bestaat of niet. Het commando wordt uitgevoerd als het in de mappen wordt gevonden, anders geeft het een fout.

Hoe zit het met het uitvoeren van een taak waarvoor meerdere opdrachten in de terminal moeten worden uitgevoerd? In deze specifieke situatie kan bash-scripting je helpen. Bash-scripting is een vorm van shell-scripting waarmee je programma's meerdere bash-commando's kunt laten uitvoeren om een ​​specifieke taak uit te voeren.



Wat zijn bugs in bash-scripting:

Tijdens het werken met bash-scripting of met andere programmeertalen, kom je veel fouten tegen. Een bug is een fout of een fout in het programma die ervoor kan zorgen dat het programma zich niet goed gedraagt.

Elke programmeertaal heeft zijn eigen procedure om bugs te vinden; op dezelfde manier heeft bash ook veel ingebouwde opties om een ​​terminalprogramma te debuggen.

Het beheren van fouten en het debuggen van een programma is niet minder dan een gedoe. Het is een tijdrovende klus en kan verergeren als u niet op de hoogte bent van de juiste tools om uw programma te debuggen. Dit artikel is een complete gids over het debuggen van bash-scripts om uw script foutloos te maken. Dus laten we beginnen:

Een bash-script debuggen:

Wanneer je aan grote programmeerprojecten werkt, kom je veel fouten of bugs tegen. Het debuggen van een programma kan soms ingewikkeld zijn. Programmeurs gebruiken meestal debugging-tools en veel code-editors helpen ook bij het vinden van bugs door de syntaxis te markeren.

Er zijn verschillende tools in Linux om codes te debuggen, bijvoorbeeld GNU Debugger aka gdb. Tools zoals GDB zijn handig voor programmeertalen die in binaire bestanden worden gecompileerd. Omdat bash een eenvoudig geïnterpreteerde taal is, zijn er geen zware tools nodig om het te debuggen.

Er zijn verschillende traditionele technieken om een ​​bash-scriptcode te debuggen, en een daarvan is het toevoegen van Beweringen. Beweringen zijn voorwaarden die in de programma's worden toegevoegd om specifieke voorwaarden te controleren en het programma dienovereenkomstig uit te voeren. Het is een verdedigingstechniek die ook helpt bij het vinden van bugs en testen. Je kunt er veel vinden gereedschap die helpen bij het toevoegen van beweringen in bash-scripts.

Nou, het toevoegen van beweringen is een van de oude traditionele technieken. Er zijn sets vlaggen/opties beschikbaar in bash om een ​​bash-script te debuggen. Deze opties kunnen samen met shebang in de scripts worden toegevoegd of worden toegevoegd tijdens het uitvoeren van het programma in de terminal. Hieronder staan ​​de onderwerpen die we gaan behandelen:

  1. Hoe bash-script te debuggen door in te schakelen uitgebreid -v optie
  2. Hoe bash-script te debuggen met behulp van xtrace -x optie
  3. Hoe bash-script te debuggen met behulp van noexec -n optie
  4. Hoe de te identificeren variabelen uitschakelen tijdens het debuggen van bash-script
  5. Hoe debuggen specifiek onderdeel van het bash-script
  6. Hoe een bash-script te debuggen met behulp van de val opdracht
  7. Hoe een bash-script te debuggen door te elimineren bestand globbing de ... gebruiken -F optie
  8. Hoe combineren debugging-opties om een ​​shellscript te debuggen
  9. Hoe omleiden debug-rapport naar een bestand

Laten we dus verschillende technieken in bash bekijken om een ​​bash-script te debuggen:

1. Hoe bash-script te debuggen door de uitgebreide -v-optie in te schakelen:

Een van de gemakkelijkste manieren om het bash-script te debuggen is het gebruik van de -v optie, ook wel uitgebreid genoemd. De optie kan worden toegevoegd met de shebang of expliciet bij de naam van het scriptbestand worden geplaatst tijdens het uitvoeren ervan. De uitgebreide optie zal elke regel van de code uitvoeren en afdrukken als het proces door de interpreter. Laten we het begrijpen met een bash-scriptvoorbeeld:

#! /bin/bash
gooide uit 'Voer nummer 1 in'
lezennummer 1
gooide uit 'Voer nummer 2 in'
lezennummer 2
indien [ '$nummer1' -gt '$nummer2' ]
dan
gooide uit 'Nummer1 is groter dan Getal2'
elif [ '$nummer1' -eq '$nummer2' ]
dan
gooide uit 'Nummer1 is gelijk aan Getal2'
anders
gooide uit 'Nummer2 is groter dan Getal1'
zijn

De bovenstaande code krijgt twee getallen van de gebruiker en voert vervolgens enkele voorwaardelijke uitspraken uit om te controleren of het getal significanter, kleiner of gelijk is aan het andere ingevoerde getal. Hoewel elke teksteditor kan worden gebruikt voor bash-scripting, gebruik ik de Vim-editor. Vim is een krachtige, veelzijdige editor die de syntaxis van bash-scripts benadrukt en de kans op syntaxisfouten verkleint. Als je geen Vim-editor hebt, kun je deze verkrijgen door de onderstaande opdracht uit te voeren:

$sudogeschiktinstalleren ik kwam

Maak een bash-scriptbestand met:

$ik kwamb_script.sh

Als je nieuw bent bij Vim-editor, raad ik je aan het te leren hoe de vim-editor te gebruiken alvorens verder te gaan.

Nu, terug naar het script, voer het script uit met behulp van -v optie:

$bash -vb_script.sh

In de bovenstaande uitvoer is te zien dat elke regel van het script in de terminal wordt afgedrukt terwijl ze door de interpreter worden verwerkt. Houd er rekening mee dat het script geen invoer meer van de gebruiker nodig heeft en vervolgens de volgende regel van het script verwerkt. Zoals hierboven besproken dat de -v optie kan na shebang worden geplaatst, zoals weergegeven in het volgende:

#! / bin / bash -v

Op dezelfde manier kan de uitgebreide vlag ook worden toegevoegd in de volgende regel van shebang met behulp van de set opdracht:

#! /bin/bash
set -v

Elk van de hierboven besproken methoden kan uitgebreid worden ingeschakeld.

2 Hoe bash-script te debuggen met de xtrace -x optie:

Execution trace, ook wel xtrace genoemd, is een slimme en handige debugging-optie, vooral om logische fouten op te sporen. Logische fouten worden meestal geassocieerd met variabelen en opdrachten. Om de status van de variabele tijdens de uitvoering van het script te controleren, gebruiken we de -x optie. Voer nu opnieuw de b_script.sh bestand met de -x vlag:

$bash -xb_script.sh

De uitvoer toont expliciet de waarde van elke variabele tijdens het uitvoeringsproces. Nogmaals, de -x kan worden gebruikt naast de shebang en na de shebang-regel met behulp van het set-commando. De xtrace plaatst het + teken bij elke regel van het script.

3 Hoe bash-script te debuggen met de optie noexec -n:

Syntaxisfouten zijn een van de belangrijkste oorzaken van bugs. Om het bash-script syntactisch te debuggen, gebruiken we noexec (geen uitvoering) modus. De optie die wordt gebruikt voor de noexec-modus is: -N. Het zal alleen de syntaxisfouten van de code weergeven in plaats van deze uit te voeren. Een veel veiligere manier om de code te debuggen. Laten we uitvoeren b_script.sh weer met de -N optie:

$bash -Nb_script.sh

Er wordt geen code uitgevoerd als er geen syntaxisfout is. Laten we nu onze code aanpassen:

#! /bin/bash

gooide uit 'Voer nummer 1 in'
lezennummer 1
gooide uit 'Voer nummer 2 in'
lezennummer 2
indien [ '$nummer1' -gt '$nummer2' ]
dan
gooide uit 'Nummer1 is groter dan Getal2'
elif [ '$nummer1' -eq '$nummer2' ]
#dan
gooide uit 'Nummer1 is gelijk aan Getal2'
anders
gooide uit 'Nummer2 is groter dan Getal1'
zijn

ik geef commentaar dan na elif . Nu, met -n execute b_script.sh script:

$bash -Nb_script.sh

Zoals verwacht, heeft het de fout duidelijk geïdentificeerd en weergegeven in de terminal.

4 Hoe de uitgeschakelde variabelen te identificeren tijdens het debuggen van bash-script:

Een typefout maken tijdens het schrijven van een code komt vaak voor. Vaak typ je een variabele verkeerd, waardoor de code niet kan worden uitgevoerd. Om een ​​dergelijke fout te identificeren, gebruiken we de -u optie. Laten we de code opnieuw aanpassen:

#! /bin/bash
gooide uit 'Voer nummer 1 in'
lezennummer 1
gooide uit 'Voer nummer 2 in'
lezennummer 2
indien [ '$num1' -gt '$nummer2' ]
dan
gooide uit 'Nummer1 is groter dan Getal2'
elif [ '$nummer1' -eq '$nummer2' ]
dan
gooide uit 'Nummer1 is gelijk aan Getal2'
anders
gooide uit 'Nummer2 is groter dan Getal1'
zijn

In de eerste indien voorwaardelijke verklaring, ik hernoemde de nummer 1 variabel naar aantal1 . nutsvoorzieningen aantal1 is een uitgeschakelde variabele. Voer nu het script uit:

$bash -ub_script.sh

De uitvoer heeft de naam van een uitgeschakelde variabele geïdentificeerd en expliciet weergegeven.

5. Hoe het specifieke deel van het bash-script te debuggen:

De xtrace-modus verwerkt elke regel van de code en geeft uitvoer. Het vinden van fouten in een grote code zou echter tijdrovend zijn als we al weten welk onderdeel de fout mogelijk veroorzaakt. Gelukkig kun je met xtrace ook een specifiek deel van de code debuggen, wat kan worden bereikt met de set opdracht. Plaats stel -x aan het begin van het gedeelte dat moet worden opgespoord en dan stel +x . in aan het einde. Ik wil bijvoorbeeld de voorwaardelijke instructies van debuggen b_script.sh , dus ik zal alle voorwaardelijke uitspraken insluiten in stel -x en stel +x . in opties zoals weergegeven in de onderstaande code:

#! /bin/bash
gooide uit 'Voer nummer 1 in'
lezennummer 1
gooide uit 'Voer nummer 2 in'
lezennummer 2
set -x
indien [ '$nummer' -gt '$nummer2' ]
dan
gooide uit 'Nummer1 is groter dan Getal2'
elif [ '$nummer1' -eq '$nummer2' ]
dan
gooide uit 'Nummer1 is gelijk aan Getal2'
anders
gooide uit 'Nummer2 is groter dan Getal1'
zijn
set+ x

Voer nu het script uit met bash b_script.sh .

De uitvoer debugt alleen de if-voorwaarden zoals gespecificeerd.

6. Hoe een bash-script te debuggen met behulp van het trap-commando:

Als uw script ingewikkeld is, zijn er ook meer uitgebreide technieken voor het debuggen. Een daarvan is de val opdracht. De val commando vangt de signalen op en voert een commando uit wanneer zich een specifieke situatie voordoet. Het commando kan een signaal of een functie zijn. Ik heb een ander script gemaakt met de naam sum_script.sh :

#! /bin/bash
val 'echo 'Regel ${LINENO}: Eerste nummer is $number1 , Tweede nummer is $number2 en som is $sum' 'DEBUG
gooide uit 'Voer eerste nummer in'
lezennummer 1
gooide uit 'Voer tweede nummer in'
lezennummer 2
som= $[nummer1 + nummer2]
gooide uit 'de som is'$som'

De val commando met DEBUG signaal geeft de status van de variabelen weer nummer 1 , nummer 2 en som na de uitvoering van elke regel zoals weergegeven in de volgende uitvoerafbeelding:

De gele blokken zijn lege ruimtes omdat de gebruiker nog niets heeft ingevoerd; deze ruimtes worden gevuld als de gebruiker waarden invoert. Deze methode is ook erg handig bij het debuggen van bash-scripts.

7. Hoe een bash-script te debuggen door bestandsglobbing te elimineren met behulp van de -f optie:

File globbing is een proces waarbij bestanden met jokertekens worden gevonden, d.w.z. * en ? . In veel situaties hoeft u bestanden niet uit te breiden tijdens het debuggen. In dergelijke gevallen kunt u het globbing van het bestand blokkeren met de -F optie. Laten we het begrijpen met een script fglobe_script.sh :

#! /bin/bash
gooide uit 'Toon alle tekstbestanden.'
ls *.tekst

De bovenstaande code geeft alle tekstbestanden in de huidige map weer, voer uit:

$bashfglobe_script.sh

Om bestandsglobbing uit te schakelen, gebruikt u de -F optie:

$bash -Ffglobe_script.sh

Op dezelfde manier kun je het gebruiken met de shebang en met de set commando ook:

#! /bin/bash
gooide uit 'Toon alle tekstbestanden.'
ls *.tekst
set -F
gooide uit 'Toon alle tekstbestanden'
ls *.tekst
set+f

Nu rennen bash fglobe_script.sh:

Het gedeelte omsloten met set -f/set +f options verwerkte geen opdrachten met jokertekens.

8. Debugging-opties combineren om shellscript te debuggen:

We gebruiken slechts één optie in de bovengenoemde debugging-technieken, maar we kunnen verschillende opties combineren voor een beter begrip. Laten we implementeren -x en -v opties voor de sum_script.sh script. ik gebruik de sum_script.sh script.

#! /bin/bash
gooide uit 'Voer eerste nummer in'
lezennummer 1
gooide uit 'Voer tweede nummer in'
lezennummer 2
som= $[nummer1 + nummer2]
gooide uit 'de som is'$som'

Voer nu uit:

$bash -xvsum_script.sh

Beide -x en -v outputs worden gecombineerd, zoals weergegeven in het outputbeeld. Op dezelfde manier kunnen we ook de combineren -u optie met uitgebreide -v voor foutdetectie. ik vervang de nummer 1 variabel met op een in de zesde regel van het script:

#! /bin/bash
is$nummer2ensomis$som' ' DEBUG
gooide uit '
Voer eerste nummer in'
lees nummer1
gooide uit '
Voer tweede nummer in'
lees nummer2
som=$[getal + getal2]
gooide uit '
desomis$som'

Voer de onderstaande opdracht uit om de uitvoer te bekijken:

$bash -uvsum_script.sh

9. Hoe debug-rapport om te leiden naar een bestand:

Het opslaan van een foutopsporingsrapport van een bash-script in een bestand kan in veel situaties handig zijn. Het is een beetje lastig om debug-rapport naar een bestand om te leiden; we gebruiken enkele speciale variabelen. Laten we het implementeren op b_script.sh code:

#! /bin/bash
uitvoerend 5>dubug_report.log
BASH_XTRACED='5'
PS4='$ LINENO--'
gooide uit 'Voer nummer 1 in'
lezennummer 1
gooide uit 'Voer nummer 2 in'
lezennummer 2
indien [ '$nummer' -gt '$nummer2' ]
dan
gooide uit 'Nummer1 is groter dan Getal2'
elif [ '$nummer1' -eq '$nummer2' ]
dan
gooide uit 'Nummer1 is gelijk aan Getal2'
anders
gooide uit 'Nummer2 is groter dan Getal1'
zijn

In de tweede regel van de code is te zien dat we de uitvoer omleiden naar a debug_report.log bestand met de uitvoerend commando met bestandsdescriptor 5 (FD5).

exec 5> debug_report.log: De uitvoerend commando leidt alles wat er in de shell gebeurt om naar een bestand debug_report.log.

BASH_XTRACEFD=5: Het is een bepaalde bash-variabele en kan niet in een andere shell worden gebruikt. Er moet een geldige bestandsdescriptor aan worden toegewezen en bash zal de uitgepakte uitvoer schrijven naar: debug_report.log.

PS4=’$LINENO– ': Het is ook een bash-variabele die wordt gebruikt om het regelnummer af te drukken tijdens het debuggen met behulp van de xtrace-modus. De standaardwaarde van PS4 is de + teken

Het bovenstaande script genereert een logbestand met de naam debug_report.log, om het te lezen, gebruik de kat opdracht:

Conclusie:

Een code vol bugs kan de prestaties van het programma beïnvloeden en ook schadelijk zijn voor de hardware. Debuggen is zeer cruciaal voor elk programma, omdat het het programma efficiënter maakt. Het vinden van bestaande en mogelijke fouten tijdens de ontwikkeling van een programma kan voorkomen dat uw programma zich onverwachts gedraagt. Grote codes hebben meestal actieve foutopsporing nodig, waardoor de effectiviteit van de code wordt verbeterd door de regresverslindende stukjes code te elimineren.

Veel programmeertalen en -omgevingen hebben hun eigen begeleidende debuggers. Bij bash-scripting kunnen verschillende technieken worden geïmplementeerd om het script te debuggen. Deze gids is grondig gefocust op alle methoden die kunnen worden gebruikt om bugs in de bash-scripts te vinden. Dus wanneer je het gevoel hebt dat je bash-script zich niet gedraagt ​​zoals verwacht, gebruik dan een van de hierboven genoemde technieken, maar de xtrace-modus (-x) is in de meeste gevallen erg handig.