Tips en Trucs 2016

Bash scripts debuggen

Voor de meeste programmeertalen bestaan er hulpmiddelen om fouten op te sporen (debug). Zo'n debugger start het te onderzoeken programma of script en volgt de werking van het script terwijl het zijn werk doet. Voor shell scripts bestaat er geen debugger, maar met behulp van enkele opties kunnen we toch fouten opsporen.

Niet uitvoeren (-n)

De -n optie (noexec) zorgt ervoor dat de shell de opdracht niet uitvoert. In plaats daarvan controleert de shell de schijfwijze (syntax). De -n optie voert dus een controle uit, vergelijkbaar met een spellings- en taalcontrole in een tekstverwerker. M.a.w. een veilige manier om scripts te testen op syntax fouten.

Een voorbeeld, het script syntax.sh

#!/bin/bash
echo "Gebruiker: $USER
echo "Persoonlijke map: $HOME"
echo "Besturingssysteem: $OSTYPE"

Voer het script uit met de -n optie:

Syntax fout

Bovenstaande uitvoer toont een syntax fout in regel vier. Op het einde van de eerste echo opdracht ontbreekt namelijk een aanhalingsteken.

Opdrachten tonen (-v)

De -v optie toont alle uit te voeren opdrachtregels, voor deze uitgevoerd worden. Dit is zeer handig bij het opsporen van fouten allerhande.

Een voorbeeld, het script gebruikers.sh:

#!/bin/bash

cut -d : -f1,5,7 /etc/passwd | grep -v sbin | grep sh | sort > /tmp/users.txt
awk -F':' ' { printf ( "%-12s %-40s\n", $1, $2 ) } ' /tmp/users.txt

# Tijdelijk bestand opruimen.
/bin/rm -f /tmp/users.txt

Voer het script uit met de -v optie:

dany@main:~> sh -v gebruikers.sh 
#!/bin/bash

cut -d : -f1,5,7 /etc/passwd | grep -v sbin | grep sh | sort > /tmp/users.txt
awk -F':' ' { printf ( "%-12s %-40s\n", $1, $2 ) } ' /tmp/users.txt
at           Batch jobs daemon                       
bin          bin                                     
daemon       Daemon                                  
dany         Dany Pinoy                              
ftp          FTP account                             
games        Games account                           
lp           Printing daemon                         
man          Manual pages viewer                     
news         News system                             
nobody       nobody                                  
root         root                                    
sshd         SSH daemon                              
uucp         Unix-to-Unix CoPy system                

# Tijdelijk bestand opruimen.
/bin/rm -f /tmp/users.txt

De uitvoer van het script bevat zowel de opdrachtregels als de uitvoer van de opdrachten. Je ziet nu tenminste waarmee het script bezig is.

Traceren (-x)

De -x optie (xtrace of execution trace) toont na het uitvoeren van elke opdracht de gebruikte opdracht. Dit helpt bij het stellen van een diagnose bij een probleem.

In de meeste gevallen krijg je met de -x optie de meest waardevolle informatie, maar het kan uitgroeien tot een waanzinnige hoeveelheid uitvoer.

dany@main:~> sh -x gebruikers.sh 
+ cut -d : -f1,5,7 /etc/passwd
+ grep -v sbin
+ grep sh
+ sort
+ awk -F: ' { printf ( "%-12s %-40s\n", $1, $2 ) } ' /tmp/users.txt
at           Batch jobs daemon                       
bin          bin                                     
daemon       Daemon                                  
dany         Dany Pinoy                              
ftp          FTP account                             
games        Games account                           
lp           Printing daemon                         
man          Manual pages viewer                     
news         News system                             
nobody       nobody                                  
root         root                                    
sshd         SSH daemon                              
uucp         Unix-to-Unix CoPy system                
+ /bin/rm -f /tmp/users.txt

In de uitvoer worden de uitgevoerde opdrachten voorafgegaan door een +-teken.