IBA verklaart glob

Oh my Glob!

Met globben kun je heel efficiënt bestanden in de terminal selecteren, zodat je nog minder hoeft in te typen en wordt aangezien voor tovenaar door de mindere gebruikers. Welke doorgewinterde LaTeXgebruiker is het ook niet zat om na elke druk op de compilatieknop door tientallen meukbestanden te navigeren? De macht van het globben geeft je eindelijk de mogelijkheid een einde maken aan al die troep. Bovendien is het woord “glob” ook gewoon leuk om te zeggen.

Deze commando’s zijn allemaal getest in bash versie 4.2.46, wat je per default tegenkomt als je op het A–Eskwadraatsysteem een terminal opstart. Het voorbeeldmapje kun je op het A–Eskwadraatsysteem terugvinden in /home/mensjes/timb/troep/glob.

De allersimpelste glob is *, wat simpelweg alle zichtbare dingen in de huidige map betekent. Dat is voor ons meteen ook een beetje nutteloos, want rm * gooit ook al je niet-meukbestanden weg.

$ echo *
boot kat klok raket rat submapje zat

Gelukkig kun je de onderdelen die in de bestandsnaam moeten voorkomen ook aan * vastplakken, zodat je rm *.aux kunt gebruiken om alle .aux-meukbestanden die LaTeX maakt, weg te gooien. Je mag ook meerdere globs en verplichte stukken tegelijk gebruiken.

$ echo k*
kat klok


$ echo *k*t
kat raket

Daarnaast zijn er globs die maar één letter aangeven. Op de plek van ? mag elk karakter staan, maar niet meer dan één.

$ echo ?at
kat rat zat

Om een keuze tussen karakters aan te geven, is er de glob [...]. Tussen de haakjes zet je de karakters die je wilt hebben. Om niet een heel alfabet te hoeven typen, kun je ook een bereik aangeven met een streepje, zoals [a-z] voor alle kleine letters. Je hebt ook [^...] om juist alles behalve de inhoud van de haakjes te krijgen zoals:

$ echo [kr]at
kat rat
$ echo [p-z]at
rat zat
$ echo [^r]at
kat zat

Uitgebreidere globs

Om geavanceerdere trucs uit te halen, moet je uitgebreidere globs aanzetten. Het commando om dat te doen is shopt -s extglob globstar.Als je uit meerdere opties wilt kiezen, geeft extglob je de glob @(...). Zet de opties met een | ertussen in de haakjes. Aangeven hoe vaak iets herhaalt kan met ?(...) voor 0 of 1 keer, *(...) voor 0 of meer en +(...) voor 1 of meer. Tenslotte heb je nog !(...) die juist alles behalve de inhoud van de haakjes kiest.

$ echo ra@(ket|t)
raket rat
$ echo !(*at)
boot klok raket submapje

Het globstar-gedeelte slaat op de glob **, die niet alleen de inhoud van de huidige map kiest, maar ook alle submappen.

$ echo **
boot kat klok raket rat submapje submapje/ondergroep submapje/onderzeeboot submapje/verwisseling zat

Deze **-globs kun je niet zomaar uitbreiden met karakters erna, anders begrijpt bash het niet als glob. Gelukkig kun met een / ertussen toch verplichte onderdelen toevoegen. Let op: deze slash betekent niet dat de glob altijd naar een submap gaat.

$ echo **boot
-bash: no match: **boot
$ echo **/*boot
boot submapje/onderzeeboot

Creatief misbruik maken van glob

Je moet goed opletten dat globben ingebouwd is in bash, en een programma dus niet weet of zijn invoer ingetypt of geglobd is. Zo kunnen bestandsnamen per ongeluk opeens opties worden, wat ervoor zorgt dat je commando’s per ongeluk iets onverwachts gaan doen. Normaal weigert rm om mappen weg te gooien, tenzij je het de optie -r geeft.

$ rm submapje
rm: cannot remove `submapje': Is a directory
$ rm -r submapje
$

Als een of andere onverlaat het bestand -r aanmaakt, ziet rm * na globben uit als rm -r boot kat klok raket rat submapje zat, en gaan je mappen er dus toch aan.

$ touch -- -r
$ rm *
$ echo *
-bash: no match: *

Een andere populaire bron van bugs is de combinatie van glob en variabelen. Als je een variabele en een glob combineert, wordt eerst de waarde van de variabele ingevuld, en dan de glob uitgebreid.
Als je variabele geen waarde heeft (bijvoorbeeld door een typfout) kan je glob plots /* worden, wat als argument voor bijvoorbeeld rm nogal spectaculaire resultaten oplevert.

$ MAPJE=submapje echo $AMPJE/*
/archief /bin /boot /dev /etc /home /lib /lib64 /lost+found /media /mnt /opt /proc /rhev /root /run /sbin /scratch /srv /sys /tmp /usr /var

Aan de andere kant kun je misbruik van globben handig gebruiken om je bestanden juist te beschermen: als je rm de optie -I meegeeft, vraagt het commando eerst of je het wel zeker weet. Zet je dus een bestand genaamd -I in je belangrijke mappen, heb je een klein beetje extra bescherming tegen je eigen stommiteiten.