Terug naar hoofdinhoud

Linux commando: cd

02 juli 2026

Elke keer dat je je door een Linux-systeem beweegt, gebruik je cd. Je typt het om een project binnen te stappen, om er weer uit te klimmen en om over een server te springen voordat je een configuratiebestand bewerkt of een log leest. Het voelt als het eenvoudigste commando dat er is: kies een map, ga erheen. Toch is cd niet eens een echt programma, en begrijpen waarom leert je iets fundamenteels over hoe Unix werkt.

1. De basis

De taak van cd is het wijzigen van je huidige werkmap: de map waarin je shell op dit moment "staat". Bijna elk ander commando werkt ten opzichte van die plek. Wanneer je ls, cat notes.txt of ./build.sh typt, zoekt de shell die bestanden vanaf je huidige map. Met cd verplaats je dat startpunt.

Twee ideeen maken cd bijzonder. Ten eerste is de huidige map geen algemene instelling voor de hele machine. Elk proces heeft zijn eigen huidige map, stilletjes overgeerfd van het proces dat het startte. Je shell heeft er een, en cd wijzigt de kopie van de shell. Ten tweede kan cd daardoor geen gewoon commando zijn dat op schijf staat. Het moet ingebouwd zijn in de shell zelf. Sectie 6 legt precies uit waarom.

Het commando dat je vaker typt dan bijna elk ander, en het commando waar de meeste mensen nooit echt bij stilstaan. Achter die twee letters schuilt de reden waarom Unix-commando's zijn opgesplitst in "programma's" en "builtins".

Dit artikel begint met de eenvoudigst mogelijke verplaatsing en bouwt op naar de directory-stack, logische versus fysieke paden, en het verrassende feit dat cd een shell-builtin is. Aan het einde begrijp je niet alleen hoe je je verplaatst, maar ook waarom dat verplaatsen werkt zoals het werkt.

Het juiste denkmodel: je shell houdt een enkele onzichtbare aanwijzer vast in de boom van het bestandssysteem. cd verplaatst die aanwijzer. Het opent niets, kopieert niets en wijzigt geen enkel bestand. Het verandert alleen waar "hier" is.

Naar boven

2. Waar komt de naam vandaan?

De naam cd is een afkorting van change directory (map wijzigen).

cd  =  Change Directory

Zoals de meeste vroege Unix-commando's is hij bewust kort gehouden. In de beginjaren van Unix werd getypt op trage teletype-terminals die elk teken letter voor letter op papier afdrukten, dus korte namen bespaarden zowel tijd als papier. Daarom bestaan zoveel basiscommando's uit twee letters: ls (list), cp (copy), mv (move), rm (remove) en cd (change directory).

Zodra een naam in het spiergeheugen van iedereen zit, is er geen reden om hem te veranderen. Vijftig jaar later is cd nog steeds cd op elk Unix-achtig systeem ter wereld.

Naar boven

3. Een korte geschiedenis

Het idee van een "huidige werkmap" was een van de vernieuwingen van het oorspronkelijke Unix bij Bell Labs in de vroege jaren 70. Voordat hierarchische bestandssystemen normaal werden, was het idee dat je "ergens" kon zijn in een boom van mappen en bestanden ten opzichte van die plek kon aanduiden, echt nieuw. De chdir-systeemaanroep, die cd onder de motorkap gebruikt, maakt sinds die eerste edities deel uit van Unix.

PeriodeMijlpaal
Vroege jaren 70 Unix introduceert het hierarchische bestandssysteem en de chdir-systeemaanroep
1979 (Bourne shell) cd is een shell-builtin; $HOME is de standaardbestemming
Jaren 80 (C shell) pushd, popd en de directory-stack verschijnen
Vandaag Bash, Zsh en elke POSIX-shell leveren cd, cd - en CDPATH

Een belangrijke opmerking over versies. Omdat cd deel uitmaakt van de shell, hangen de exacte functies af van welke shell je gebruikt, niet van je Linux-distributie. Dit artikel beschrijft Bash, de standaardshell op de meeste Linux-systemen. Zsh en andere shells gedragen zich voor dagelijks gebruik vrijwel identiek, met hier en daar wat extra gemak.

Naar boven

4. Eenvoudige toepassingen

4.1 De eenvoudigst mogelijke verplaatsing

Geef cd een pad en het brengt je erheen. In de voorbeelden hieronder is de regel die begint met $ wat je typt; pwd ("print working directory") bevestigt waar je bent geland.

$ cd /var/log
$ pwd
/var/log

Merk op dat cd niets afdrukt wanneer het lukt. Stilte betekent succes. Dit is de Unix-gewoonte van "geen nieuws is goed nieuws": een commando laat pas van zich horen als er iets misgaat.

4.2 Absolute en relatieve paden

Je kunt cd op twee manieren naar een map wijzen. Een absoluut pad begint met een schuine streep en beschrijft de locatie vanaf de wortel van het bestandssysteem. Een relatief pad begint niet met een schuine streep en wordt begrepen vanaf waar je nu bent.

$ cd /etc/nginx        # absoluut: altijd dezelfde plek
$ cd sites-enabled     # relatief: een map binnen waar ik al ben

Relatieve paden maken cd snel. Als je al in /etc/nginx bent, typ je cd sites-enabled in plaats van het volledige pad.

4.3 Omhoog gaan: ..

Elke map bevat twee bijzondere items: . betekent "deze map" en .. betekent "de bovenliggende map". Je gebruikt .. voortdurend om weer omhoog te klimmen.

$ cd ..            # een niveau omhoog
$ cd ../..         # twee niveaus omhoog
$ cd ../sibling    # een omhoog, dan omlaag naar een buurmap

4.4 Naar huis gaan: cd zonder pad

Typ cd op zichzelf, zonder iets erachter, en het brengt je naar je home-map. Dit is de waarde van de variabele $HOME, meestal /home/jouwnaam.

$ cd
$ pwd
/home/peter

De tilde ~ is een afkorting voor diezelfde plek, en werkt ook als onderdeel van een langer pad:

$ cd ~             # home, hetzelfde als cd zonder pad
$ cd ~/Documents   # de map Documents binnen home
$ cd ~peter        # de home-map van gebruiker "peter"

4.5 Terugspringen: cd -

Dit is degene die als magie voelt zodra je hem kent. cd - brengt je terug naar de map waar je net daarvoor was, voor de laatste cd. Het wisselt tussen twee plekken, als de "vorige zender"-knop op een afstandsbediening.

$ pwd
/home/peter/project
$ cd /etc/nginx
$ cd -             # spring terug
/home/peter/project
$ cd -             # en weer terug
/etc/nginx

Merk op dat cd - ook de map afdrukt waar het naartoe ging. Het is de enige vorm van cd die niet stil is, omdat het handig is om te zien waar je bent geland. Achter de schermen onthoudt de shell je vorige map in een variabele genaamd $OLDPWD, en cd - springt daar simpelweg naartoe.

Naar boven

5. Gemiddelde toepassingen

5.1 Een snelkoppelingspad: CDPATH

Standaard kijkt een relatieve cd alleen in je huidige map. De variabele CDPATH verandert dat. Het is een lijst van "basis"-mappen, gescheiden door dubbele punten, die cd ook doorzoekt wanneer je een relatieve naam opgeeft. Het werkt zoals PATH dat voor programma's doet, maar dan voor mappen.

$ export CDPATH=~/projects:~/work
$ cd website      # niet hier, maar gevonden in ~/projects/website
/home/peter/projects/website

Nu kun je vanuit elke locatie cd website typen en land je in ~/projects/website, zonder het volledige pad te typen. Wanneer cd via CDPATH het doel vindt, drukt het het resulterende pad af zodat je ziet waar je daadwerkelijk terechtkwam.

Een handige truc, met een valkuil: zet altijd . (de huidige map) ergens in CDPATH, meestal vooraan. Anders kan een relatieve cd stiekem een map uit je lijst verkiezen boven een die vlak naast je staat.

5.2 Tab-aanvulling

Je typt zelden een hele mapnaam. Druk op Tab na een paar letters en de shell vult hem voor je aan; druk twee keer op Tab om alle overeenkomsten te zien.

$ cd /et<Tab>           # vult aan tot /etc/
$ cd Doc<Tab>           # vult aan tot Documents/

Tab-aanvulling is onderdeel van de shell, niet van cd zelf, maar de twee worden zo vaak samen gebruikt dat ze als een geheel aanvoelen. Het is de grootste reden waarom ervaren gebruikers zich zo snel bewegen.

5.3 Mapnamen in variabelen: cdable_vars

Bash heeft een optioneel gemak genaamd cdable_vars. Als je het inschakelt, behandelt cd een gewoon woord als de naam van een variabele wanneer er geen map met die naam bestaat.

$ shopt -s cdable_vars
$ export proj=~/projects/website
$ cd proj              # geen map "proj", dus gebruik de variabele
/home/peter/projects/website

Het is een kleine functie, maar hij toont een thema dat door dit hele artikel loopt: cd probeert stilletjes meerdere strategieen om het woord dat je typte om te zetten in een echte locatie.

5.4 Wanneer cd mislukt

Anders dan de meeste commando's tot nu toe kan cd mislukken, en het vertelt je waarom. De twee alledaagse fouten zijn een pad dat niet bestaat en een map die je niet mag binnengaan.

$ cd /no/such/place
bash: cd: /no/such/place: No such file or directory

$ cd /root
bash: cd: /root: Permission denied

Om een map binnen te gaan heb je uitvoerrechten nodig (het x-bit dat je zag bij ls -l). Voor een map betekent "uitvoeren" niet dat je hem draait; het betekent het recht om erin te stappen. Daarom kan een map leesbaar zijn en toch je cd weigeren.

Naar boven

6. Geavanceerde toepassingen

6.1 Waarom cd een shell-builtin moet zijn

Hier komt het feit dat cd echt interessant maakt. Voer deze twee commando's uit:

$ type cd
cd is a shell builtin
$ which cd
$                       # geeft niets: er is geen programma dat cd heet

Er is geen bestand /bin/cd of /usr/bin/cd om uit te voeren. cd is ingebouwd in de shell. De reden is een van de belangrijkste regels in Unix: een kindproces kan de huidige map van zijn ouder niet wijzigen.

Wanneer je een gewoon programma als ls draait, start de shell het als een apart kindproces. Dat kind krijgt zijn eigen kopie van de huidige map. Als cd een gewoon programma was, zou het als kind starten, zijn eigen huidige map wijzigen en dan stoppen, en zou je shell (de ouder) geen millimeter zijn verplaatst. De wijziging zou met het kind verdwijnen.

shell (jouw proces)           huidige map: /home/peter
   |
   +-- start een programma      krijgt een KOPIE van de huidige map
        wijzigt zijn eigen map
        stopt                    de kopie wordt weggegooid
   |
shell (jouw proces)           huidige map: NOG STEEDS /home/peter

De enige manier om de eigen map van de shell te wijzigen is de code binnen het shell-proces uit te voeren, niet in een kind. Dat is precies wat een builtin is: een commando dat de shell zelf uitvoert. Dus cd moet een builtin zijn. Hetzelfde geldt voor alles wat de eigen toestand van de shell moet wijzigen, zoals export en umask.

Onder de motorkap doet de shell de daadwerkelijke verplaatsing via een enkele kernel-systeemaanroep genaamd chdir() ("change directory"). De huidige werkmap is geen uitvinding van de shell; het is een eigenschap die de kernel voor elk proces bijhoudt. Wanneer je cd /var/log typt, roept de shell chdir("/var/log") aan, en werkt de kernel de eigen huidige map van het shell-proces bij. Omdat een kindproces een kopie van die map erft maar nooit bij zijn ouder kan komen, is de builtin de enige plek waar die aanroep zinvol kan gebeuren.

6.2 De directory-stack: pushd, popd, dirs

Waar cd - een enkele vorige map onthoudt, onthoudt de directory-stack een hele stapel. pushd ("push directory") verplaatst je naar een nieuwe map en bewaart je huidige map bovenop een stapel. popd ("pop directory") verwijdert het bovenste item en brengt je ernaar terug. dirs toont de stapel.

$ cd /usr
$ pushd /etc         # ga naar /etc, onthoud /usr
/etc /usr
$ pushd /var         # ga naar /var, onthoud /etc en /usr
/var /etc /usr
$ dirs -v            # toon de stapel, genummerd
 0  /var
 1  /etc
 2  /usr
$ popd               # verwijder /var, ga terug naar /etc
/etc /usr

Zo maak je een korte omweg zonder je plek kwijt te raken. Je doet pushd naar een andere map, verricht een kleine klus, en popd gaat rechtstreeks terug naar waar je was. Bij een diepe taak met veel sprongen wint de stapel het van paden uit je hoofd onthouden.

6.3 Logisch versus fysiek: -L en -P

Symbolische links laten een map binnen een andere verschijnen. Dat roept een subtiele vraag op: wanneer je via een symlink cd doet en dan cd .. typt, waar moet "omhoog" je dan brengen? Terug langs de weg die je kwam, of omhoog in de echte map op schijf?

Standaard is cd logisch (de optie -L, kort voor logical): het onthoudt het pad dat je typte, symlinks en al. De optie -P (kort voor physical) laat cd eerst elke symlink oplossen, zodat je in de echte map op schijf zit.

$ ln -s /var/www/html site   # "site" is een link naar /var/www/html
$ cd site
$ pwd
/home/peter/site             # logisch: het pad dat je volgde
$ pwd -P
/var/www/html                # fysiek: de echte locatie

$ cd ..                      # logisch: terug naar /home/peter
$ cd -P site && cd ..        # fysiek: omhoog van /var/www/html naar /var/www

Meestal is de logische standaard wat je wilt, omdat die overeenkomt met hoe je er kwam. Grijp naar cd -P wanneer je geeft om de echte locatie op schijf, bijvoorbeeld in een script dat niet in de war mag raken van een pad met een symlink.

Naar boven

7. Iets wat de meeste gebruikers niet weten

7.1 Er bestaat echt een /usr/bin/cd (op sommige systemen)

We zeiden net dat cd geen extern programma kan zijn. Dat klopt voor het wijzigen van jouw shell. Toch vereist de POSIX-standaard nog steeds dat er een cd-hulpprogramma als bestand bestaat, en sommige Unix-systemen (met name macOS) leveren echt een /usr/bin/cd mee. Wat zou dat in vredesnaam kunnen doen?

Vrijwel niets nuttigs. Als je het draait, start het als een kindproces, wijzigt het de map van dat kind en stopt het meteen. Je shell verplaatst zich niet. Het bestand bestaat alleen zodat standaardconforme scripts en tools die een echt commando zoeken er een kunnen vinden. Op de meeste Linux-systemen is het bestand niet eens aanwezig, omdat de builtin alles is wat iemand ooit nodig heeft. Het is een kleine herinnering dat een "commando" en een "programma op schijf" niet hetzelfde zijn.

7.2 Een cd in een script gaat niet met je mee naar buiten

Dezelfde builtin-regel verrast mensen die scripts schrijven. Wanneer je een script draait, start het in zijn eigen shell-proces. Elke cd erin wijzigt de map van dat proces, niet die van jou. Als het script eindigt, sta je precies waar je begon.

$ cat goto.sh
#!/bin/bash
cd /var/log        # wijzigt alleen de map van het SCRIPT
$ ./goto.sh
$ pwd
/home/peter        # ongewijzigd: het script draaide in een kind-shell

Als je echt wilt dat een script jouw shell verplaatst, moet je het draaien met source goto.sh (of de korte vorm . goto.sh), wat de regels in je huidige shell uitvoert in plaats van in een kind. Dit is ook waarom mensen een kleine shell-functie schrijven, geen script, wanneer ze een eigen "spring naar mijn project"-commando willen.

7.3 $PWD, $OLDPWD en de verwijderde map

De shell bewaart je huidige map in de variabele $PWD en de vorige in $OLDPWD (de variabele die cd - aandrijft). Een vreemde situatie is het weten waard: als een ander proces de map verwijdert waar je in zit, sta je nu in een map die geen naam meer op schijf heeft.

$ cd /tmp/work
$ rm -rf /tmp/work     # gedaan vanuit een andere terminal
$ ls
ls: cannot open directory '.': No such file or directory

De oplossing is simpel: cd naar ergens dat nog bestaat, bijvoorbeeld cd ~ of cd ... Het is een mooie demonstratie dat "waar je bent" een levende verwijzing naar een echte map is, en niet zomaar een stukje tekst.

Naar boven

8. Best practices

  • Leer cd - vandaag nog. Wisselen tussen twee mappen met cd - bespaart meer toetsaanslagen dan bijna elke andere truc. Maak dit als eerste automatisch.
  • Gebruik pushd en popd voor omwegen. Als je even een andere map in moet en meteen terug wilt, houdt de directory-stack je plek voor je vast.
  • Leun op Tab-aanvulling. Typ een paar letters en druk op Tab. Het is sneller en het voorkomt typefouten in lange paden.
  • Stel CDPATH in voor mappen die je voortdurend bezoekt, en neem altijd . op in de lijst zodat een nabije map alsnog wint.
  • Gebruik source, geen uitvoering, wanneer een script je shell moet verplaatsen. Een gewone ./script.sh wijzigt alleen de eigen map van het script.
  • Grijp naar de documentatie. Omdat cd een builtin is, zit de handleiding in de shell, niet in een aparte pagina.
$ help cd           # de ingebouwde hulp voor cd (Bash)
$ help pushd        # en voor de directory-stack
$ man bash          # de volledige shell-handleiding, met een sectie SHELL BUILTINS

Merk op dat man cd meestal "No manual entry" zegt, juist omdat cd geen zelfstandig programma is. Gebruik in plaats daarvan help cd.

Naar boven

9. Veelgemaakte fouten

9.1 Drie hardnekkige mythes

MytheWerkelijkheid
"cd is een programma zoals ls." Het is een shell-builtin. Er is geen /bin/cd om te draaien, en die kan ook niet nuttig zijn.
"Een cd in mijn script wijzigt mijn shell." Het wijzigt alleen het eigen kindproces van het script. Gebruik source om je shell te beinvloeden.
"cd .. gaat altijd naar de echte bovenliggende map." Standaard volgt het het pad dat je nam. Via een symlink gebruik je cd -P voor de echte bovenliggende map.

9.2 Andere valkuilen om te vermijden

  • "Kan niet binnengaan" verwarren met "bestaat niet". Een Permission denied-fout betekent dat de map er is maar dat je het uitvoer-bit erop mist, niet dat het pad verkeerd is.
  • Proberen naar een bestand te cd-en. Als je cd naar een gewoon bestand wijst in plaats van een map, krijg je bash: cd: notes.txt: Not a directory. Dat is een andere fout dan "No such file", en betekent meestal dat je een commando als cat of less bedoelde, niet cd.
  • . vergeten in CDPATH. Zonder deze kan een relatieve cd stilletjes naar een map uit je lijst springen in plaats van naar die vlak naast je.
  • Verwachten dat cd het pad afdrukt. Bij succes blijft het stil. Alleen cd - en een CDPATH-treffer drukken af waar je landde.
  • In een verwijderde map zitten. Als commando's ineens mislukken met "No such file or directory" voor ., zit je in een map die is verwijderd. Doe gewoon cd naar ergens dat nog bestaat.
  • Aannemen dat spaties zonder aanhalingstekens goed gaan. Om My Documents binnen te gaan, zet je het tussen aanhalingstekens: cd "My Documents" of cd My\ Documents. Anders leest de shell twee argumenten.
Naar boven

10. Samenvatting

Het commando cd lijkt triviaal, maar het is een deur naar hoe Unix-processen en het bestandssysteem echt werken.

  • cd betekent "change directory". Het verplaatst de huidige werkmap van je shell, de plek waarvandaan elk ander commando werkt.
  • Het kan geen gewoon programma zijn, omdat een kindproces de map van zijn ouder niet kan wijzigen. Daarom is cd een shell-builtin.
  • Kale cd gaat naar home, cd .. gaat omhoog, cd - springt terug naar de vorige map, en ~ is een afkorting voor home.
  • CDPATH geeft een relatieve cd een zoekpad; cdable_vars laat een variabelenaam voor een map staan.
  • pushd, popd en dirs beheren een stapel mappen om omwegen te maken zonder je plek kwijt te raken.
  • -L (logisch, de standaard) volgt het pad dat je typte; -P (fysiek) lost symlinks op naar de echte locatie op schijf.
  • Een cd in een script verplaatst alleen dat script; gebruik source om je eigen shell te verplaatsen.
  • De hulp zit in de shell: help cd, niet man cd.

Dit is het handige overzicht om te bewaren:

cd DIR       ga naar een map
cd           ga naar je home-map
cd ~/x       ga naar map x binnen home
cd ..        ga een niveau omhoog
cd -         spring terug naar de vorige map
pushd DIR    ga erheen en bewaar de oude plek op de stapel
popd         keer terug naar de laatst bewaarde plek
dirs -v      toon de directory-stack, genummerd
cd -P DIR    ga de echte map binnen, symlinks opgelost
help cd      de ingebouwde handleiding

Kleine commando's als cd verbergen verrassend veel van hoe Linux is opgebouwd. Als je servers zich gedragen op manieren die moeilijk te verklaren zijn, of als je een opzet wilt die dagelijks makkelijker te beheren is, loont het vaak om goed naar de basis te kijken. Dat is precies het soort werk waar ik graag bij help.

Naar boven
Linux commando: cd
Peter Martin
Peter Martin
Joomla Specialist

Peter is Joomla specialist en Linux admin voor snelle, veilige en schaalbare websites.