Helberg > Persoonlijk > Joost > Bugs in UNIXSearch | Sitemap
sorting with -u and -k
< vorige | volgende >Snow B.V.

Bugs in UNIX

Op de SANE conference 2006 vertelde Bill Cheswick over een aantal bugs in Unix. Er zijn er natuurlijk nog veel meer dan de door hem toen gerapporteerde fouten in grep en ls. Op deze pagina mijn persoonlijke smaak als het gaat om bugs in Unix.

De meest bekende bug is natuurlijk de naam van de system-call creat. Een van de bedenkers van Unix gaf aan dat dat een van de zwakke punten van Unix was. Die call had natuurlijk create moeten heten. Het aardige is dat de consistentie in naamgeving (open, close, read, write en ioctl allemaal 5 of minder letters) tot de naam van de system-call heeft geleid die een node aanmaakt. Afwijken van die consistentie was bij het bedenken van Unix natuurlijk onhaalbaar. Nu wel blijkbaar?

  • sort -u doet hetzelfde als sort | uniq. Althans zo wordt het vaak uitgelegd. In combinatie met de mogelijkheid om op velden in regels te sorteren (met -t en -k) levert de unique optie onverwachte resultaten op.

    echo 'aap:1:2

    noot:1:2'| sort -t: -k2 -k3

    levert als uitvoer:

    aap:1:2

    noot:1:2

    Maar

    echo 'aap:1:2

    noot:1:2'| sort -u -t: -k2 -k3

    levert:

    aap:1:2

  • grep (Cheswick) maakt onderscheid tussen 1 en meer dan 1 argument. Indien er in meerdere bestanden gezocht wordt, wordt de naam van het bestand plus een `:' voor de match gezet. Indien maar 1 bestand wordt meegegeven niet. Dat is vooral lastig in scripts en als xargs gebruikt wordt. De schrijvers van scripts zullen dus vaak: grep $args /dev/null gebruiken als ze niet zeker zijn van het aantal argumenten.
  • ls -l (Cheswick) laat een lijst van bestanden zien die voorafgegaan wordt door een regel die begint met `total'. Het getal daarachter zegt iets, maar de manual page van GNU ls vertelt je niet wat!
  • ls, mits stdout een terminal is, laat de bestanden in kolommen zien. Het aantal is afhankelijk van de breedte van je scherm. In een script echter, als de output opgevangen wordt in een pipe voor verdere verwerking, staat op elke regel (gelukkig maar) een enkele bestandsnaam. Sommige moderne versies van Unix maken het nog bonter en laten kleurtjes zien als stdout een terminal is. Waarom verdwijnen die kleuren als je een pipe gebruikt: ls | egrep [[:color=red:]] zou toch ook zinnig kunnen zijn?
  • wc levert (ook in combinatie met de opties -l, -w en -c) een getal op dat voorafgegaan wordt door een TAB. Dat is een drama in scripts. Altijd moet je de output van wc door sed heen pipen om iets bruikbaars te krijgen.
  • shutdown (voor de mensen die Unix nog maar kort kennen: met dit commando stop je een Unix systeem) stelt de vraag: `do you want to continue'. Dat is natuurlijk een typisch commando-centered vraag: shutdown wil weten of je door wilt gaan met het proces om de computer uit te zetten. De gebruiker echter, wil stoppen: de computer moet immers uit. De vraag is dus verkeerd, in dit geval zelfs zodanig dat `no' tot een onverwacht resultaat leidt: de procedure wordt afgebroken. Natuurlijk valt hierover te discussieren, maar dat alleen al is een indicatie voor een bug. Het down-brengen van een computersysteem is dermate belangrijk dat er geen misverstand mag bestaan over hoe je dat weer intrekt.