LX-SCR-INFO-bash-debuggen
Updated 7/27/10 00:35

bash debuggen

  1. De editor

    Een goed geconfigureerde editor behoedt een alerte programmeur voor veel syntaxfouten.
    Kijk maar even naar het volgende screenshot van vim:



    En na een verkeerdelijk ingetoetste backspace ...


    Misschien valt het niet direct op, maar een regelmatige gebruiker zal snel merken dat er wat mis is. Een permanente display van je huidig regelnummer is ook een geweldige hulp.

    Een editor als gedit of kate zal ook kleurencodes gebruiken.

    Merk op dat vim-full moet geïnstalleerd zijn om de kleuren te activeren. Afhankelijk van je distributie vergt dit meer of minder zoekwerk.

    Merk ook op dat als je een file editeert die nog niet executable is, er geen kleuren worden gebruikt. Vim gaat er dan terecht van uit dat je een gewoon tekstbestand editeert. De kleuren komen pas tevoorschijn na je eerste save en chmod +x

  2. extra echo

    Je kan je script debuggen door op vele plaatsen variabelen op scherm te brengen met een echo. Het plaatsen van sleep opdrachten vertraagt ook de uitvoering van een script zodat je meer tijd hebt om te zien waar het mis gaat. Als alles werkt, plaats je gewoon een kommentaarteken voor je debug-echo en debug-sleep.

  3. #!/bin/bash -x

    Je kan de shebang aanpassen naar #!/bin/bash -x , en dan gebeurt het volgende:

    $ ats
    + bestand=
    + '[' '!' -e ''
    /home/bert/bin/ats: line 7: [: missing `]'
    ++ date +%Y%m%d%H%M
    + datum=201007241651
    + echo 'Timestamp: 201007241651'
    Timestamp: 201007241651
    + echo

    + echo 'now moving  to .201007241651'
    now moving  to .201007241651
    + mv -v .201007241651
    mv: missing destination file operand after `.201007241651'
    Try `mv --help' for more information.


    Elke stap wordt op scherm gebracht. Je kan dan ook beter zien waar het mis gaat.
    Hoewel het hier een gewone syntaxfout betreft die anders ook vermeld wordt. We hadden die daarnet zelf aangebracht om te laten zien dat vim aan de hand van kleuren syntaxfouten aan het licht brengt. We passen de fout even aan, en testen opnieuw ...

    $ ats zipar
    + bestand=zipar
    + '[' '!' -e zipar ']'
    ++ date +%Y%m%d%H%M
    + datum=201007241655
    + echo 'Timestamp: 201007241655'

    Timestamp: 201007241655
    + echo

    + echo 'now moving zipar to zipar.201007241655'
    now moving zipar to zipar.201007241655
    + mv -v zipar zipar.201007241655
    `zipar' -> `zipar.201007241655'

    We zien tussenresultaten (++) verschijnen, toegekende waarden aan variabelen, en we kunnen het ganse proces volgen. Dit is vooral belangrijk bij lussen en functies, omdat we dan beter kunnen zien waar het mis gaat.

    In plaats van je script shebang te wijzigen, kan je het script ook uitvoeren als volgt:

    $ bash -x jescript

    Het is aan de gebruiker om te kiezen wat het makkelijkst werkt.

    Je kan nog meer informatie op scherm brengen met -xv.

    $ bash -xv ats
    #!/bin/bash
    #
    # ats: add time stamp wijzigt de naam van een file of een directory
    #      naar zichzelf met extensie een timestamp
    #
    bestand=$1
    + bestand=
    if [ ! -e "$bestand" ]
    then
        echo 'usage: ats <filename>'
        echo 'file not found'
    else
        datum=`date +"%Y%m%d%H%M"`
        echo 'Timestamp: '$datum
        echo
        echo "now moving $bestand to $bestand.$datum"
        mv -v $bestand $bestand.$datum
    fi
    + '[' '!' -e '' ']'
    + echo 'usage: ats <filename>'
    usage: ats <filename>
    + echo 'file not found'
    file not found

    Tot slot kun je ook delen van je script debuggen met

    set -x
    set -


    Alles wat zich tussen deze twee bash commando's bevindt wordt gedebugd. De rest niet:

    $ cat ats
    #!/bin/bash
    #
    # ats: add time stamp wijzigt de naam van een file of een directory
    #      naar zichzelf met extensie een timestamp
    #
    bestand=$1
    if [ ! -e "$bestand" ]
    then
    set -x
        
    echo 'usage: ats <filename>'
        echo 'file not found'
    set -
    else
        datum=`date +"%Y%m%d%H%M"`
        echo 'Timestamp: '$datum
        echo
        echo "now moving $bestand to $bestand.$datum"
        mv -v $bestand $bestand.$datum
    fi


    We hebben de debugger geplaatst op het then deel van de if (wat gebeurt er als de file niet bestaat) Uitvoeren met een bestaande file, activeert de debugger niet:

    $ ats zipar
    Timestamp: 201007241711

    now moving zipar to zipar.201007241711
    `zipar' -> `zipar.201007241711'

    Uitvoeren zonder filenaam activeert de debugger wel:

    $ ats
    + echo 'usage: ats <filename>'
    usage: ats <filename>
    + echo 'file not found'
    file not found
    + set -


  4. bashdb

    Stap voor stap debuggen kan met bashdb.
    Voor 'die hard' bash fans bestaat er bash debugger; meer informatie vind je op:
    http://bashdb.sourceforge.net/bashdb.html

    Misschien vind je hem wel met aptitude, apt-get, yum of gewoon standaard bij je distributie.

  5. links:

    http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_03.html
    http://tldp.org/LDP/abs/html/abs-guide.html#DEBUGGING