Linux commando: man
Elk Linux-systeem wordt geleverd met een compleet naslagwerk, geïnstalleerd op schijf, beschikbaar zonder internetverbinding, en geschreven door dezelfde mensen die de software schreven. De meeste gebruikers lopen eraan voorbij. Ze zoeken op het web naar een optie die drie regels verderop staat in een pagina die ze al op hun eigen machine hebben. Het commando dat dat naslagwerk opent is man.
1. De basis
De man-pagina van man zelf omschrijft het in een regel: "an interface to the system reference manuals". Dat woord interface is het belangrijkste. man bevat zelf geen documentatie. Het zoekt een bestand, maakt het op, en geeft het door aan een pager zodat jij erdoorheen kunt scrollen.
Je gebruikt het door te noemen waarover je wilt lezen:
$ man ls
Je scherm vult zich met de man-pagina van ls, en je zit nu in een pager. Druk op q om er weer uit te komen.
1.1 Een man-pagina is een bestand op schijf
Hier is niets magisch aan. Vraag man waar hij de pagina vandaan haalde met -w (kort voor where, waar):
$ man -w ls
/usr/share/man/man1/ls.1.gz
Dat is een met gzip gecomprimeerd tekstbestand. Je kunt de ruwe bron zelf bekijken:
$ zcat /usr/share/man/man1/pwd.1.gz | head -8
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.48.5.
.TH PWD "1" "January 2026" "GNU coreutils 9.4" "User Commands"
.SH NAME
pwd \- print name of current/working directory
.SH SYNOPSIS
.B pwd
[\fI\,OPTION\/\fR]...
.SH DESCRIPTION
Die commando's die met een punt beginnen zijn roff-opmaak, een zetsysteemtaal die ouder is dan Unix zelf. .TH is de titelkop, .SH begint een sectiekop, \fB schakelt over naar vet. Als je man pwd typt, gebeuren er vier dingen achter elkaar:
mandoorzoekt een lijst mappen naar een bestand met de naampwd.1,pwd.5enzovoort.- Het pakt dat bestand uit.
- Het haalt de roff-bron door groff, dat de opmaak omzet in tekst op de breedte van jouw terminal.
- Het stuurt het resultaat naar een pager, normaal gesproken
less.
Elke optie die man heeft verandert een van die vier stappen: waar hij kijkt, welk bestand hij kiest, hoe hij opmaakt, of waarmee hij het toont. Zodra je die pijplijn ziet, is de lijst met opties niet langer willekeurig.
Het juiste mentale model:
manweet niets overls. Hij weet hoe hij een bestand vindt, hoe hij het zet, en hoe hij het aan jou toont. De kennis zit in het bestand, niet in het commando.
1.2 Een naslagwerk, geen cursus
Beginners lezen vaak een man-pagina, vinden hem compact en onvriendelijk, en komen nooit meer terug. Die reactie is begrijpelijk, maar hij beoordeelt de pagina op het verkeerde doel. Een man-pagina is een naslagwerk: compleet, precies, en ingedeeld om dingen op te zoeken, niet om een onderwerp vanaf nul te leren.
Een man-pagina beantwoordt "hoe precies", nooit "waarom zou ik". Als die tweede vraag de jouwe is, heb je een ander document nodig.
Je hoort man ls niet van boven naar beneden te lezen. Je hoort hem te openen, naar de ene optie te springen die je nodig hebt, en hem weer te sluiten. Hoofdstuk 4 van dit artikel laat zien hoe je dat doet.
2. Waar komt de naam vandaan?
De naam man is kort voor manual, handleiding. Niets slimmers dan dat.
man = MANual
whatis = "what is this command?"
apropos = an English word borrowed from French, "with regard to"
mandb = MANual DataBase
De volledige naam van het oorspronkelijke document was de Unix Programmer's Manual, en een "man-pagina" is letterlijk een pagina daaruit. Het naslagwerk was genummerd in delen, en die nummering leeft vandaag voort als de secties die je in hoofdstuk 5 van dit artikel tegenkomt.
Je ziet documentatie voortdurend geschreven in de vorm ls(1), passwd(5), signal(7). Dat is geen versiering. Het is een precieze verwijzing: de pagina met de naam ls, in sectie 1 van het naslagwerk. Als een man-pagina zegt "see chmod(2)", vertelt hij je dat de interessante pagina de systeemaanroep in sectie 2 is, en niet het commando in sectie 1. Leer die notatie lezen en de helft van de verwarring rond man verdwijnt.
3. Een korte geschiedenis
Het naslagwerk is even oud als Unix. De Unix Programmer's Manual, First Edition was gedateerd 3 november 1971 en geschreven door Ken Thompson en Dennis Ritchie bij Bell Labs. Hun afdelingshoofd, Doug McIlroy, drong er hard op aan dat er hoe dan ook documentatie zou bestaan, en die discipline bleef: op vroeg Unix schreef je bij een programma ook de man-pagina.
Dat eerste naslagwerk had de vorm die je vandaag nog steeds ziet. Pagina's waren gegroepeerd in genummerde secties, en elke pagina gebruikte dezelfde koppen in dezelfde volgorde: NAME, SYNOPSIS, DESCRIPTION, FILES, SEE ALSO, DIAGNOSTICS, BUGS. Vijftig jaar later volgt een man-pagina die deze week geschreven wordt nog steeds dat skelet.
De sectie BUGS verdient even aandacht. Het was vanaf het begin een officiele, verwachte kop, waarin de auteur opsomde wat zijn eigen programma verkeerd deed. Dat is een opmerkelijke afspraak, en hij bestaat nog steeds. Lees de BUGS-sectie van een pagina voordat je het gereedschap vertrouwt.
| Periode | Mijlpaal |
|---|---|
| 1964 | RUNOFF op CTSS, de tekstopmaker waar roff van afstamt |
| 1971 | De Unix Programmer's Manual, First Edition, met genummerde secties en het commando man |
| 1973 | troff richt zich op een fotozetmachine voor gedrukte handleidingen; nroff geeft dezelfde bron weer op terminals |
| 1990 | 4.3BSD-Reno voegt de mdoc-macro's toe: semantische opmaak ("dit woord is een optie") in plaats van visuele opmaak ("dit woord is vet") |
| Jaren 90 | GNU groff verschijnt als de vrije vervanger van troff, en wordt de opmaker op Linux |
| Vandaag | man-db op de meeste Linux-distributies, mandoc op de BSD's |
Het zetdetail is de moeite waard om te kennen, want het verklaart de rare hoekjes. Bell Labs betaalde de PDP-11 waar Unix naartoe verhuisde deels omdat die een tekstverwerkingssysteem voor de octrooiafdeling zou draaien. Het naslagwerk was bedoeld om gedrukt te worden, op een echte zetmachine, met echte lettertypen en uitgevulde tekst. Jouw terminal toont je een uitgeklede weergave van een document dat voor papier ontworpen is. Daarom breekt een man-pagina woorden af aan het einde van een regel, en daarom is de tekst uitgevuld op een vaste breedte. Paragraaf 7.1 laat zien wat je dat kost bij kopieren en plakken.
Er zijn twee implementaties in breed gebruik. Linux-distributies leveren man-db, en dat is wat dit artikel beschrijft:
$ man --version
man 2.12.0
De BSD's gebruiken in plaats daarvan mandoc, en macOS erft zijn gereedschap voor het naslagwerk van die kant van de familie. De dagelijkse commando's zijn hetzelfde (man ls, man 5 passwd, apropos, whatis), omdat POSIX zover standaardiseert. De verschillen zitten in de extra's: de omgevingsvariabelen, de indexdatabase, en opties zoals -K. Als een optie uit dit artikel niet werkt op macOS, is dat de reden.
4. Eenvoudige toepassingen
4.1 Een pagina openen en erin navigeren
De eenvoudigst mogelijke toepassing is de commandonaam op zichzelf:
$ man cp
Je zit nu in less, dezelfde pager die je krijgt van less eenbestand.txt. Onderaan het scherm zet man een regel die je precies vertelt op welke pagina je terechtkwam:
Manual page cp(1) line 1
Die regel is het lezen waard voordat je iets anders doet. Hij bevestigt zowel de naam als de sectie, zodat je weet of je de pagina kreeg die je bedoelde. Dit zijn de toetsen die je nodig hebt:
| Toets | Doet |
|---|---|
Space / b |
Een scherm vooruit / achteruit |
Down / Up |
Regel voor regel |
g / G |
Naar het begin / het einde van de pagina |
/woord |
Vooruit zoeken naar woord |
n / N |
Volgende / vorige zoekresultaat |
h |
Het helpscherm van de pager zelf |
q |
Afsluiten |
Alles wat je al over less weet geldt hier, want het is less. Als de toetsen zich op jouw systeem anders gedragen, is je pager een ander programma; paragraaf 6.3 legt uit hoe je dat verandert.
4.2 De onderdelen van een man-pagina
Man-pagina's zijn geen vrije vorm. De koppen liggen vast, ze verschijnen in een vaste volgorde, en die afspraak is zelf gedocumenteerd in man 7 man-pages. Dit zijn de koppen die je tegenkomt:
| Kop | Wat erin staat |
|---|---|
| NAME | De naam en een samenvatting van een regel. Precies die regel doorzoeken whatis en apropos. |
| SYNOPSIS | De exacte aanroepsyntaxis. Het meest compacte en meest bruikbare deel van de pagina. |
| DESCRIPTION | Wat het commando doet en hoe het zich gedraagt. |
| OPTIONS | Elke optie, een voor een. Vaak samengevoegd met DESCRIPTION. |
| EXIT STATUS | Wat de numerieke afsluitcodes betekenen. Onmisbaar bij scripten. |
| ENVIRONMENT | Omgevingsvariabelen die het commando leest. |
| FILES | Configuratiebestanden en paden die het commando gebruikt. |
| EXAMPLES | Uitgewerkte voorbeelden. Begin hier als de pagina ze heeft. |
| STANDARDS | Uit welke standaard het gedrag komt: POSIX, ISO C, BSD, of alleen Linux. HISTORY zegt wanneer het verscheen. |
| BUGS | Bekende problemen, toegegeven door de auteur. |
| SEE ALSO | Verwante pagina's, geschreven als naam(sectie). De kaart die uit deze pagina wegleidt. |
Omdat de koppen tegen de linkerkantlijn staan, kun je er direct naartoe springen met een zoekopdracht in de pager die aan het regelbegin verankerd is:
$ man rsync
/^EXAMPLES # then press Enter, and n for the next hit
/^EXIT STATUS
/^ENVIRONMENT
Dit is de gewoonte die man-pagina's verandert van een muur tekst in een naslagwerk dat je echt kunt gebruiken. Niet scrollen. Springen.
4.3 Hoe je een SYNOPSIS leest
De SYNOPSIS is een samengeperste grammatica van het commando. Hij gebruikt een notatie die niemand ooit uitlegt, en daarom slaan veel mensen hem over. Dit is de hele notatie:
| Notatie | Betekent |
|---|---|
| Vette tekst | Typ dit precies zo, teken voor teken |
| Onderstreepte of cursieve tekst | Vervang dit door je eigen waarde |
| WOORDEN IN HOOFDLETTERS (GNU-tools) | Hetzelfde: een plaatshouder die je invult |
[ ] |
Optioneel. De haken typ je niet mee. |
... |
Het vorige onderdeel mag herhaald worden |
| |
Kies een van de alternatieven |
| Meerdere SYNOPSIS-regels | Meerdere verschillende werkwijzen van hetzelfde commando |
Lees er nu een echte. Dit is de complete SYNOPSIS van ls:
$ man ls
SYNOPSIS
ls [OPTION]... [FILE]...
Beide delen zijn optioneel en beide mogen herhaald worden. Dus ls, ls -l, ls -l -a /etc /var zijn allemaal geldig, en ls /etc /var zonder opties ook. Die ene regel vertelde je de volledige aanroepconventie.
Nu een met echte structuur:
$ man cp
SYNOPSIS
cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...
Drie regels betekent drie werkwijzen. De eerste regel kopieert een enkel ding naar een enkele bestemming. De tweede regel kopieert een of meer bronnen in een map, en merk op dat SOURCE... herhaald mag worden en DIRECTORY niet, dus het laatste argument is het doel. De derde regel doet hetzelfde met het doel vooraan benoemd door -t, wat je gebruikt als de lijst met bronnen uit een pipe komt. Het hele gedrag van cp waar mensen over struikelen staat in die drie regels.
Pagina's in sectie 2 en 3 zien er anders uit, omdat ze C-functies documenteren in plaats van commando's:
$ man 3 printf
SYNOPSIS
#include <stdio.h>
int printf(const char *restrict format, ...);
int fprintf(FILE *restrict stream,
const char *restrict format, ...);
Hier geeft de SYNOPSIS je het header-bestand dat je moet includeren en de exacte prototypes. Zelfde idee, ander publiek: het blijft "hoe roep ik dit ding aan".
4.4 De pagina die je wilt is vaak niet die je typte
Een commandonaam kan meerdere man-pagina's hebben. man kiest er zelf een uit, en zegt er niet bij welke. Probeer dit:
$ whatis passwd
passwd (1) - change user password
passwd (1ssl) - OpenSSL application commands
passwd (5) - the password file
Drie verschillende pagina's, allemaal passwd geheten. Kaal man passwd geeft je het commando in sectie 1. Als je eigenlijk de opbouw van /etc/passwd zocht, moet je expliciet om de sectie vragen. Dat is het hele antwoord op de vraag "waarom bestaat man 5 passwd", en hoofdstuk 5 gaat daar precies over.
5. Gemiddelde toepassingen
5.1 De secties van het naslagwerk
Het naslagwerk is opgedeeld in genummerde secties naar soort ding, niet naar onderwerp. Deze lijst komt rechtstreeks uit man man:
| Sectie | Bevat | Voorbeeld |
|---|---|---|
| 1 | Uitvoerbare programma's en shell-commando's | man 1 ls |
| 2 | Systeemaanroepen, geleverd door de kernel | man 2 open |
| 3 | Bibliotheekfuncties, functies binnen programmabibliotheken | man 3 printf |
| 4 | Speciale bestanden, meestal in /dev |
man 4 random |
| 5 | Bestandsformaten en afspraken | man 5 passwd |
| 6 | Spelletjes | man 6 intro |
| 7 | Diversen: afspraken, protocollen, overzichten | man 7 signal |
| 8 | Systeembeheercommando's, meestal alleen voor root | man 8 mount |
| 9 | Kernelroutines (niet standaard, zelden geïnstalleerd) | - |
Sectie 5 en sectie 8 zijn de twee die zich meteen terugbetalen voor iedereen die een server beheert. Sectie 5 documenteert de bestandsformaten, en dat is meestal precies wat je zoekt als je een configuratiebestand aanpast:
$ man 5 passwd # the layout of /etc/passwd, field by field
$ man 5 crontab # the five time fields, not the crontab command
$ man 5 fstab # every column of /etc/fstab
$ man 5 sshd_config # every option you can put in that file
Het voorbeeld van crontab is het duidelijkst. crontab(1) is het commando dat je draait om je crontab te bewerken en documenteert een stuk of vier opties. crontab(5) is de pagina die uitlegt wat die vijf sterretjes betekenen. Mensen zoeken jarenlang op het web naar cron-syntaxis zonder te ontdekken dat het antwoord al die tijd in man 5 crontab stond.
Pagina's worden gerangschikt naar het soort ding dat ze documenteren, niet naar onderwerp.
passwdhet commando enpasswdhet bestand zijn twee ongerelateerde documenten die toevallig een naam delen, en daarom staan ze in verschillende secties.
Sectie 7 is de verborgen parel: daar staan de overzichtspagina's die een heel onderwerp uitleggen in plaats van een programma.
$ man 7 signal # every signal, what it does, and the default action
$ man 7 hier # what every directory in the filesystem is for
$ man 7 ascii # the ASCII table, in octal, decimal and hex
$ man 7 man-pages # how manual pages themselves are written
$ man 7 glob # what * and ? and [a-z] really match
$ man 7 path_resolution # exactly how Linux turns a path into a file
$ man 7 capabilities # the root privileges, split into 40 separate ones
$ man 7 namespaces # the kernel feature containers are built on
Elke sectie heeft ook een intro-pagina die beschrijft wat erin hoort. man 1 intro, man 2 intro, enzovoort tot en met man 8 intro.
5.2 Welke pagina's bestaan er: whatis en man -f
Voordat je een pagina leest, is het vaak de moeite waard om te vragen welke pagina's er onder een naam bestaan. Het commando whatis beantwoordt precies dat, door de NAME-regel van elke passende pagina te tonen:
$ whatis printf
printf (1) - format and print data
printf (3) - formatted output conversion
Het commando man -f (kort voor whatis) doet hetzelfde:
$ man -f printf # identical output to: whatis printf
Dit is een controle van twee seconden die echte verwarring voorkomt. Als je man printf typt op zoek naar het shell-commando en een pagina vol %llu en va_list krijgt, had whatis je vooraf beide pagina's laten zien.
5.3 Elke versie lezen: man -a
De optie -a (kort voor all, alles) toont elke passende pagina achter elkaar in plaats van alleen de eerste. Als je een pagina afsluit, opent de volgende. Gecombineerd met -w wordt het een snelle inventarisatie:
$ man -aw intro
/usr/share/man/man1/intro.1.gz
/usr/share/man/man8/intro.8.gz
/usr/share/man/man3/intro.3.gz
/usr/share/man/man2/intro.2.gz
/usr/share/man/man5/intro.5.gz
/usr/share/man/man4/intro.4.gz
/usr/share/man/man6/intro.6.gz
/usr/share/man/man7/intro.7.gz
Acht pagina's met de naam intro, en kaal man intro toont je alleen de eerste. Kijk goed naar de volgorde van die lijst: het is niet 1, 2, 3, 4. Paragraaf 7.3 legt uit waarom, en dat is een van de nuttigste dingen uit dit artikel.
5.4 Een commando vinden waarvan je de naam niet kent: apropos
Alles tot nu toe ging ervan uit dat je de commandonaam kent. Het lastigere probleem is het omgekeerde: je weet wat je wilt doen, maar niet hoe het gereedschap heet. Daar is apropos voor. Het doorzoekt de NAME-beschrijvingen van elke geïnstalleerde pagina:
$ apropos mkdir
mkdir (1) - make directories
mkdir (2) - create a directory
mkdirat (2) - create a directory
Het commando man -k (kort voor keyword, trefwoord) is hetzelfde programma:
$ man -k mkdir # identical to: apropos mkdir
Standaard worden de zoektermen als losse trefwoorden behandeld. Zet een zin tussen aanhalingstekens en beperk hem tot een sectie om bruikbare resultaten te krijgen in plaats van honderden:
$ apropos -s 1 'copy files'
cp (1) - copy files and directories
cpio (1) - copy files to and from archives
gh-codespace-cp (1) - Copy files between local and remote file systems
Nuttige aanvullingen:
| Optie | Effect |
|---|---|
-s 1 of -s 1,8 |
Beperk tot een of meer secties |
-e |
Exacte overeenkomst op het hele woord, geen deel van een woord |
-w |
Behandel de term als jokerteken, bijvoorbeeld whatis -w 'ls*' |
--regex |
Behandel de term als reguliere expressie |
-a |
Eis dat alle trefwoorden voorkomen, in plaats van minstens een ervan |
Een eerlijke waarschuwing: apropos doorzoekt alleen die ene NAME-regel. Als een auteur een slechte samenvatting schreef, is de pagina er in feite onzichtbaar voor. Voor echt zoeken in de volledige tekst, zie paragraaf 6.4.
5.5 Waar staat deze pagina: man -w
De optie -w toont het pad in plaats van de pagina te openen. Het is de snelste manier om te beantwoorden of iets op deze machine wel gedocumenteerd is, en het werkt ook met een sectienummer:
$ man -w 5 passwd
/usr/share/man/man5/passwd.5.gz
Het maakt ook een nette test in een script, omdat het niets toont en een waarde ongelijk aan nul teruggeeft als er geen pagina is.
Naar boven6. Gevorderde toepassingen
6.1 Zelf de sectie kiezen: -S en MANSECT
Je weet al dat een kaal sectienummer voor de naam een sectie kiest:
$ man 5 passwd
De langere vorm neemt een lijst, in de volgorde waarin je ze geprobeerd wilt hebben:
$ man -S 5,1 passwd # try section 5 first, fall back to 1
$ man --sections=8,1 mount
Als je altijd een andere voorkeur wilt, zet dan MANSECT in plaats van het elke keer te typen. Een beheerder die in configuratiebestanden leeft, wil misschien sectie 5 en 8 voor sectie 1 hebben:
$ export MANSECT=8:5:1:7:2:3
6.2 Hoe man bepaalt waar hij zoekt
Man-pagina's staan in een manual path, een lijst mappen gescheiden door dubbele punten, net als PATH. Vraag de jouwe op:
$ manpath
/usr/share/man:/home/peter/.local/share/man:/usr/local/man:/usr/local/share/man
$ man --path # the same thing, from man itself
Die lijst staat niet vast in het programma. Hij wordt opgebouwd uit /etc/manpath.config, dat twee interessante soorten regels bevat:
MANDATORY_MANPATH /usr/share/man
MANDATORY_MANPATH /usr/local/share/man
MANPATH_MAP /usr/bin /usr/share/man
MANPATH_MAP /usr/local/bin /usr/local/share/man
MANPATH_MAP /opt/bin /opt/man
De MANPATH_MAP-regels zijn het slimme deel. Ze zeggen: "voeg voor elke map in het PATH van de gebruiker de bijbehorende map met man-pagina's toe". Dus als je een programma in /opt/bin installeert en dat in je PATH zet, worden zijn man-pagina's in /opt/man automatisch vindbaar. Het manual path volgt het uitvoerbare pad.
Je kunt het geheel overschrijven met de omgevingsvariabele MANPATH, maar er zit een valkuil aan: instellen vervangt de berekende lijst in plaats van eraan toe te voegen. Daarom doet een dubbele punt aan het begin of het einde ertoe, want een lege positie betekent "voeg hier de standaardlijst in":
$ MANPATH=/opt/mytool/man man --path
/opt/mytool/man # ONLY this. Everything else is gone.
$ MANPATH=/opt/mytool/man: man --path
/opt/mytool/man:/usr/share/man:/home/peter/.local/share/man:/usr/local/share/man
Geef voor een enkel commando de voorkeur aan -M boven iets exporteren:
$ man -M /opt/mytool/man mytool
6.3 man prettig maken
man leest een handvol omgevingsvariabelen. Deze vier zijn het kennen waard:
| Variabele | Effect |
|---|---|
MANPAGER |
Het programma waarmee pagina's worden getoond. Gaat voor PAGER. |
MANWIDTH |
Maak op tot deze breedte in plaats van de breedte van de terminal. |
MANSECT |
De zoekvolgorde van secties (zie 6.1). |
MANOPT |
Opties die op elke man-aanroep worden toegepast, alsof je ze typte. |
Twee ervan lossen echte ergernissen op. Op een heel breed scherm wordt een man-pagina slecht leesbaar omdat de regels eindeloos doorlopen; MANWIDTH zet hem vast op een prettige maat:
$ export MANWIDTH=80
En met MANOPT maak je een voorkeur blijvend zonder alias. Deze zet afbreken en uitvullen uit voor elke pagina die je ooit opent, om de reden die in paragraaf 7.1 staat:
$ export MANOPT="--no-hyphenation --no-justification"
Een pagina als platte tekst wegschrijven is makkelijk, omdat man merkt dat zijn uitvoer geen terminal is en dan automatisch alle opmaak weglaat:
$ man ls > ls.txt # plain text, no control characters
$ man -P cat ls # same, forcing the pager to cat
$ MANPAGER=cat man ls # same, through the environment
Daarmee is een man-pagina gewoon een tekststroom, dus de rest van het Unix-gereedschap werkt erop:
$ man cp | grep -A2 -- '-l, --link'
-l, --link
hard link files instead of copying
$ man ls | wc -l # how long is this page really?
6.4 Zoeken in de volledige tekst: man -K
apropos kijkt alleen naar de NAME-regel. De optie -K (kort voor global apropos) doorzoekt de inhoud van elke man-pagina op het systeem. Het is traag, want het pakt duizenden bestanden uit en scant ze, maar het vindt dingen die niets anders vindt:
$ man -wK -S 5 'MANPATH_MAP'
/usr/share/man/man5/manpath.5.gz
Twee gewoontes maken het bruikbaar. Beperk de secties met -S, en voeg -w toe zodat je een lijst paden krijgt in plaats van dat je een voor een in elke passende pagina belandt.
Er is een subtiliteit waar de eigen man-pagina eerlijk over is: -K doorzoekt de roff-bron van elke pagina, niet de opgemaakte tekst, omdat alles opmaken veel trager zou zijn. Het kan dus valse treffers geven door commentaar in de bron, en treffers missen als de bron iets anders schrijft dan er op het scherm verschijnt. Een minteken dat in de bron als \- geschreven staat is het klassieke voorbeeld, en daarom vindt zoeken naar een optie met -K soms niets.
Toch is dit het gereedschap voor de vraag "in welk configuratiebestand zit deze obscure instelling?". Let op: -K is een uitbreiding van man-db en niet overal beschikbaar.
6.5 Andere manieren om een pagina weer te geven
Omdat het opmaken een aparte stap in de pijplijn is, kun je die omleiden. Een man-pagina die je gedownload hebt, of die je aan het schrijven bent, open je met -l (kort voor local file, lokaal bestand):
$ man -l ./mytool.1
$ man -l /tmp/downloaded.8.gz
Zonder -l zou man dat pad als paginanaam behandelen en falen.
De zeterfenis leeft nog. -t (kort voor troff) maakt de pagina op voor druk in plaats van voor een terminal:
$ man -t ls | head -2
%!PS-Adobe-3.0
%%Creator: groff version 1.23.0
$ man -t ls > ls.ps # PostScript
$ man -t ls | ps2pdf - ls.pdf # a printable PDF of the manual page
Er is ook -H, dat een pagina naar HTML omzet en in een browser opent. Let op dat op Debian en Ubuntu standaard alleen groff-base geïnstalleerd is, dat wel PostScript kan maken maar geen HTML; daar faalt man -H tot je het volledige pakket groff installeert.
6.6 Sectie 2 en 3: het naslagwerk voor programmeurs
Sectie 2 en 3 zijn een ander naslagwerk voor een andere lezer, en ze zijn het deel van het systeem dat vrijwel niemand per ongeluk ontdekt. Sectie 2 documenteert de systeemaanroepen, de scheidslijn tussen jouw programma en de kernel. Sectie 3 documenteert bibliotheekfuncties, die in je eigen proces draaien en er meestal systeemaanroepen onder gebruiken.
$ man 2 open # the kernel system call
$ man 3 fopen # the C library function built on top of it
$ man 2 read $ man 3 malloc
$ man 2 fork $ man 3 pthread_create
Dat paarsgewijze verband is het hele punt van de splitsing. open() is een verzoek aan de kernel; fopen() is een omhulsel eromheen dat buffering en administratie in user space toevoegt. Het sectienummer vertelt je aan welke kant van die grens je staat.
Deze pagina's gebruiken hun eigen koppen. Een commando heeft EXIT STATUS; een functie heeft RETURN VALUE en ERRORS:
$ man 2 open
RETURN VALUE
On success, open(), openat(), and creat() return the new file de-
scriptor (a nonnegative integer). On error, -1 is returned and errno
is set to indicate the error.
ERRORS
EACCES The requested access to the file is not allowed ...
De sectie ERRORS is de reden om deze pagina's te openen. Hij somt elke errno-waarde op die de aanroep kan opleveren en wat elke waarde betekent, en dat vat geen enkele zoekopdracht op het web correct samen.
Een valkuil heeft zijn eigen antwoord in de SYNOPSIS staan. Sommige functies worden pas gedeclareerd als je eerst een feature-test macro definieert, en de pagina vertelt je welke:
$ man 3 asprintf
SYNOPSIS
#define _GNU_SOURCE /* See feature_test_macros(7) */
#include <stdio.h>
int asprintf(char **restrict strp, const char *restrict fmt, ...);
Sla je die eerste regel over, dan meldt de compiler dat asprintf niet gedeclareerd is, terwijl de man-pagina hem duidelijk documenteert. De pagina wijst zelfs het overzicht aan: man 7 feature_test_macros legt _GNU_SOURCE, _POSIX_C_SOURCE en de rest uit. Dit is een geval waarin de SYNOPSIS letterlijk lezen, inclusief het commentaar, je een middag bespaart.
Pagina's in sectie 2 en 3 hebben ook een STANDARDS-sectie, die je vertelt of een interface POSIX is, een erfenis van BSD, of alleen Linux. Dat is het verschil tussen code die overdraagbaar is en code die dat niet is. Als deze pagina's op jouw machine ontbreken, zie paragraaf 7.7.
6.7 Man-pagina's in je eigen taal
Man-pagina's kunnen vertaald worden, en de mappenstructuur heeft naast de genummerde mappen een submap per taal:
$ ls /usr/share/man/ | grep -v '^man[1-9]$' | tr '\n' ' '
ca ca@valencia cs da de de.UTF-8 es fi fr fr.ISO8859-1 fr.UTF-8 hr hu id it
ja ja.UTF-8 ko nl pl pt pt_BR ro ru sk sl sr sv tr uk zh zh_CN zh_TW
Je instellingen voor LANG en LC_MESSAGES bepalen welke man verkiest. Je kunt ook rechtstreeks om een taal vragen met -L:
$ man -L nl apropos
APROPOS(1) Hulpprogramma's paginaopmaker APROPOS(1)
NAAM
apropos - namen en beschrijvingen van de man-pagina's doorzoeken
SAMENVATTING
Twee opmerkingen uit de praktijk. Ten eerste is de dekking dun. Deze machine heeft 105 Nederlandse pagina's tegenover 9761 Engelse, en ze komen bijna allemaal van apt, dpkg en man-db zelf. Voor al het andere krijg je Engels, wat je taalinstelling ook is.
Ten tweede kan een vertaling achterlopen op het origineel, omdat de Engelse pagina met de software meekomt en de vertaling met een taalpakket. Als je Engelse documentatie volgt, met een collega vergelijkt, of een probleem meldt, forceer dan het origineel:
$ man -L C apropos # the untranslated page
$ man -L C -w apropos
/usr/share/man/man1/apropos.1.gz
Dat is ook de snelste manier om te controleren of een kop die je niet kunt vinden ontbreekt of alleen maar vertaald is.
6.8 De rare sectienamen: 1ssl, 3perl, 3avr
Kijk nog eens naar de uitvoer van whatis en je ziet secties die geen kaal getal zijn:
$ whatis passwd
passwd (1) - change user password
passwd (1ssl) - OpenSSL application commands
passwd (5) - the password file
De letters achter het getal zijn een sub-extensie. Daarmee claimt een project zijn eigen ruimte binnen een sectie, zodat de passwd van OpenSSL niet botst met de passwd van het systeem. Je komt 1ssl, 3perl, 3pm, 3posix en andere tegen. Vraag er een op met -e:
$ man -e ssl passwd # the OpenSSL page
$ man 1ssl passwd # the same, written the short way
6.9 Een man-pagina schrijven voor je eigen script
Als je scripts schrijft die anderen (of jij over een jaar) op een server draaien, kost een man-pagina erbij ongeveer tien minuten en laat het ze geïnstalleerd lijken in plaats van geimproviseerd. Het formaat is gewoon roff. Dit is een complete, werkende pagina:
.TH DEPLOY 1 "August 2026" "1.0" "Site tools"
.SH NAME
deploy \- push the website to production
.SH SYNOPSIS
.B deploy
[\fB\-n\fR] \fISITE\fR
.SH DESCRIPTION
Pushes the checked-out site to the production server.
De regel .TH neemt vijf velden: de naam in hoofdletters, de sectie, de datum, de versie, en de titel van het naslagwerk die in de kop verschijnt. .SH begint een sectiekop, .B maakt de volgende regel vet, en \fB ... \fR en \fI ... \fR schakelen binnen een regel over naar vet en cursief.
Installeer hem in de lokale structuur en bouw de index opnieuw op:
$ sudo cp deploy.1 /usr/local/share/man/man1/
$ sudo mandb
1 man subdirectory contained newer manual pages.
1 manual page was added.
$ man deploy
DEPLOY(1) Site tools DEPLOY(1)
NAME
deploy - push the website to production
SYNOPSIS
deploy [-n] SITE
Bekijk hem voor het installeren rechtstreeks vanuit je werkmap met man -l deploy.1. Let op het ontsnapte koppelteken in deploy \- push: in roff is een kaal - een typografisch koppelteken, en \- het letterlijke minteken. Dat verkeerd doen is de reden dat sommige man-pagina's je een teken geven dat je niet terug in een shell kunt plakken.
7. Iets wat de meeste gebruikers niet weten
7.1 Het koppelteken dat je kopieerde is geen koppelteken
Deze bijt mensen jarenlang zonder dat ze het merken. Man-pagina's zijn uitgevuld en afgebroken, omdat ze voor druk ontworpen zijn. Als groff een woord over twee regels breekt, voegt hij een echt typografisch koppelteken in, U+2010, en dat is niet de ASCII-- op je toetsenbord.
Tel de niet-ASCII-tekens in een pagina die helemaal geen niet-ASCII-inhoud heeft:
$ man 1 intro | grep -c -P '[^\x00-\x7F]'
14
$ man 1 intro | grep -o -P '[^\x00-\x7F]' | head -1 | hexdump -C
00000000 e2 80 90 |...|
Die drie bytes zijn UTF-8 voor U+2010 HYPHEN. Zet nu afbreken en uitvullen uit:
$ man --no-hyphenation --no-justification 1 intro | grep -c -P '[^\x00-\x7F]'
2
De overgebleven twee zijn echte leestekens in de brontekst. Al het andere was een bijproduct van de opmaak.
Waarom dit ertoe doet: als je een lange optie uit een man-pagina kopieert en die toevallig over een regel gebroken was, plak je een onzichtbaar niet-ASCII-teken in je terminal en krijg je een onbegrijpelijke foutmelding over een commando dat overduidelijk bestaat. Hetzelfde vervuilt stilletjes documentatie en supportmeldingen. De oplossing is een regel in je shell-profiel:
export MANOPT="--no-hyphenation --no-justification"
De korte vormen zijn --nh en --nj. Man-pagina's met een rafelrand lezen op een scherm ook prettiger, dus je verliest er niets mee.
7.2 apropos doorzoekt een cache, niet je systeem
man zoekt elke keer op schijf naar pagina's. apropos en whatis niet: die bevragen een vooraf gebouwde index, en als die index verouderd is vertellen ze je met stelligheid dat een pagina niet bestaat.
$ ls -l /var/cache/man/index.db
-rw-r--r-- 1 man man 1552384 Aug 21 10:23 /var/cache/man/index.db
Kijk hoe het eerst faalt en daarna werkt. Hier is zojuist een nieuwe pagina geïnstalleerd:
$ man deploy # works immediately, man searched the filesystem
DEPLOY(1) ...
$ apropos deploy # fails, the index has not been told
deploy: nothing appropriate.
$ sudo mandb
1 manual page was added.
0 stray cats were added.
0 old database entries were purged.
$ apropos deploy
deploy (1) - push the website to production
Op een normale desktop of server draait een geplande taak deze index dagelijks opnieuw op, dus je merkt het zelden. Je merkt het wel in een container, op een minimaal image, of vlak na het met de hand installeren van een pakket: apropos vindt niets terwijl man prima werkt. Draai sudo mandb en het is opgelost.
Overigens is "0 stray cats were added" geen typefout. Een cat-pagina is een vooraf opgemaakte kopie van een man-pagina, bewaard in /var/cache/man/cat1 en vergelijkbare mappen zodat hij niet opnieuw gezet hoeft te worden. Op machines die snel genoeg zijn om groff in een paar milliseconden te draaien is die cache in feite dood; op moderne systemen zijn die mappen meestal leeg.
7.3 De zoekvolgorde van secties is niet 1, 2, 3
Herinner je de verrassende volgorde van man -aw intro in paragraaf 5.3: 1, 8, 3, 2, 5, 4, 6, 7. Dat is niet willekeurig, en niet alfabetisch. Het is een ingestelde voorkeur, die in een regel van /etc/manpath.config staat:
$ grep '^SECTION' /etc/manpath.config
SECTION 1 n l 8 3 0 2 3type 3posix 3pm 3perl 3am 5 4 9 6 7
Van links naar rechts gelezen is dat de volgorde waarin man secties probeert als jij er geen noemt. Deze ene regel beantwoordt meerdere alledaagse raadsels tegelijk:
- Waarom geeft
man printfhet commando en niet de C-functie? Sectie 1 komt voor sectie 3. - Waarom geeft
man passwdhet commando en niet het bestandsformaat? Sectie 1 komt voor sectie 5. En 8, 3 en 2 ook. - Waarom is een beheercommando zo makkelijk te vinden? Sectie 8 staat als tweede in de lijst, direct na 1.
- Waarom voelen bestandsformaten verstopt? Sectie 5 staat op de negende plaats, achter zes andere secties.
Zodra je die regel gezien hebt, is "welke pagina krijg ik?" geen gok meer. En als je het oneens bent met de volgorde, liet paragraaf 6.1 zien hoe je hem verandert met MANSECT.
7.4 man sluit niet af met 1
Scripts die op documentatie controleren doen dit verkeerd. Een ontbrekende pagina levert geen afsluitcode 1 op:
$ man nosuchthing >/dev/null 2>&1; echo $?
16
De sectie EXIT STATUS van man man beschrijft het hele stelsel: 0 gelukt, 1 een fout in het gebruik of de configuratie, 2 een operationele fout, 3 een kindproces faalde, en 16 "ten minste een van de pagina's, bestanden of trefwoorden bestond niet of gaf geen treffer". Test in een script dus op succes in plaats van op een specifieke fout:
if man -w "$1" >/dev/null 2>&1; then
echo "documented"
else
echo "no manual page for $1"
fi
7.5 Shell-builtins hebben geen man-pagina
Probeer de handleiding van cd te lezen:
$ man cd
No manual entry for cd
$ man cd >/dev/null 2>&1; echo $?
16
Dit verwart elke beginner, en de reden is logisch zodra je hem ziet. Man-pagina's documenteren programma's, en er is geen programma dat cd heet. Het is een builtin: een commando dat in de shell zelf zit ingebouwd, omdat van map veranderen het proces van de shell zelf moet raken. Hetzelfde geldt voor export, alias, source, ulimit en type.
Er zijn drie manieren om die documentatie wel te bereiken:
$ help cd # bash's own builtin help, the direct answer
$ man bash # the full shell manual; then search /^ cd
$ man 7 builtins # a stub page that points you at bash(1)
De tussenpagina is een mooie toevoeging op Debian en Ubuntu, en whatis laat zien waar hij voor dient:
$ whatis builtins
builtins (7) - bash built-in commands, see bash(1)
Als je niet zeker weet met wat voor soort ding je te maken hebt, vraag het dan aan de shell voordat je het aan man vraagt:
$ type -a cd
cd is a shell builtin
$ type -a ls
ls is aliased to `ls --color=auto'
ls is /bin/ls
7.6 man draait een sandbox om groff heen
Een man-pagina tonen klinkt ongevaarlijk. Het is niet helemaal zo ongevaarlijk als het klinkt, want roff is geen opmaaktaal in de moderne zin. Het is een volwaardige programmeertaal voor zetwerk, en de opmaker die hem verwerkt is een fors stuk parseercode dat draait op welk bestand je er ook op richt.
man-db neemt dat serieus. Zijn eigen man-pagina zegt het, in de sectie ENVIRONMENT:
MAN_DISABLE_SECCOMP
On Linux, man normally confines subprocesses that handle untrusted
data using a seccomp(2) sandbox. This makes it safer to run complex
parsing code over arbitrary manual pages.
Met andere woorden: elke keer dat je een man-pagina opent, draaien het uitpakprogramma en de opmaker in een sandbox die door de kernel afgedwongen wordt en die beperkt welke systeemaanroepen ze mogen doen. Je ziet er nooit iets van, en dat is precies de bedoeling.
Daar volgen twee dingen uit. Als een pagina met een verwarrende fout weigert op te maken, bestaat MAN_DISABLE_SECCOMP=1 als diagnosemiddel, maar het is een manier om te bewijzen waar een probleem zit, geen oplossing om in je profiel te laten staan. En een .1-bestand dat je ergens gedownload hebt is onvertrouwde invoer net als elk ander bestand: man -l ./watdanook.1 is redelijk, een vreemd roff-bestand door een opmaker halen met de sandbox uitgezet niet.
7.7 De pagina bestaat wel, hij is alleen niet geïnstalleerd
"No manual entry for open" betekent niet dat de pagina nooit geschreven is. Op Debian en Ubuntu komen de meeste pagina's die dit artikel aanraadt niet van het programma dat ze documenteren. Ze komen van aparte documentatiepakketten:
$ dpkg -S /usr/share/man/man2/open.2.gz
manpages-dev: /usr/share/man/man2/open.2.gz
$ dpkg -S /usr/share/man/man3/printf.3.gz
manpages-dev: /usr/share/man/man3/printf.3.gz
$ dpkg -S /usr/share/man/man7/feature_test_macros.7.gz
manpages: /usr/share/man/man7/feature_test_macros.7.gz
Het hele programmeursnaslagwerk uit paragraaf 6.6, en een flink deel van de overzichten in sectie 7, komen dus met manpages en manpages-dev. Geen van beide staat op een minimale server. Installeer ze en er verschijnen pagina's die nooit van het internet ontbraken, alleen van jouw machine:
$ sudo apt install manpages manpages-dev
Dezelfde logica geldt nog sterker binnen containers. Slanke basis-images stellen de pakketbeheerder zo in dat man-pagina's tijdens het uitpakken worden weggegooid, om een paar megabytes te besparen, dus man documenteert in een container vaak helemaal niets.
Als een pagina die je verwachtte er niet is, loop dan deze lijst af voordat je concludeert dat hij niet bestaat:
- Is het programma zelf geïnstalleerd? Controleer met
type -a naam. - Is het een shell-builtin in plaats van een programma? Zie paragraaf 7.5.
- Is er een apart documentatiepakket, zoals
manpages-devof een-doc-pakket voor dat project? - Staat de map met de pagina in je manual path? Controleer met
manpath, en zie paragraaf 6.2. - Vindt
manhem wel enaproposniet? Dan is de index verouderd:sudo mandb. - Zit je in een container of op een uitgekleed image waar de pagina's bij het installeren verwijderd zijn?
7.8 Weten waar man ophoudt
Een deel van vakmanschap is weten wanneer een gereedschap het verkeerde is. Linux heeft vier documentatiecommando's die uitwisselbaar lijken en dat niet zijn, en het verschil ertussen is niet de vorm. Het is waar de tekst vandaan komt.
| Commando | Waar de tekst vandaan komt | Grijp ernaar wanneer |
|---|---|---|
cmd --help |
Het programma dat je zojuist draaide | Je snel een optie wilt nakijken, of zeker moet weten dat het antwoord bij de geïnstalleerde versie hoort |
man cmd |
Een documentatiepakket, los geïnstalleerd van het programma | Je het volledige naslagwerk wilt: elke optie, de bestanden, de afsluitcodes, de verwante pagina's |
help cmd |
Het shell-proces waarin je zit te typen | Het commando een shell-builtin is, dus er geen programma en geen man-pagina te vinden is |
info cmd |
De eigen handleiding van het GNU-project, een apart document | Je een GNU-programma echt wilt leren in plaats van een optie op te zoeken |
/usr/share/doc/<pakket>/ |
De pakketbeheerder | Je READMEs, changelogs of voorbeeldconfiguraties nodig hebt die geen man-pagina bevat |
help hoort bij de shell, niet bij het systeem. Dat is makkelijk te bewijzen, en het is de reden dat het dingen kan documenteren die man niet kan:
$ type help
help is a shell builtin
$ help -d cd
cd - Change the shell working directory.
$ help -s cd
cd: cd [-L|[-P [-e]] [-@]] [dir]
Gebruik -d voor de beschrijving van een regel en -s voor alleen de synopsis, wat meestal is wat je wilde. Vraag het naar iets dat geen builtin is en het weigert, en wijst je meteen naar het juiste gereedschap:
$ help ls
bash: help: no help topics match `ls'. Try `help help' or `man -k ls' or `info ls'.
info is waar GNU het echte naslagwerk bewaart. Voor GNU-projecten is de man-pagina vaak een samenvatting, en dat zegt hij zelf. Kijk naar de laatste regels van man ls:
SEE ALSO
dircolors(1)
Full documentation <https://www.gnu.org/software/coreutils/ls>
or available locally via: info '(coreutils) ls invocation'
Die pagina werd gegenereerd uit ls --help. Het document dat uitlegt waarom de opties zich gedragen zoals ze doen is de info-handleiding:
$ info coreutils 'ls invocation'
$ info grep
$ info bash
Info-documenten zijn opgebouwd als gekoppelde knopen in plaats van een lange pagina, dus ze hebben andere toetsen nodig: n en p voor de volgende en vorige knoop, u om een niveau omhoog te gaan, Enter om de link onder de cursor te volgen, en q om af te sluiten. Als die navigatie je stoort, tonen pinfo en de info-lezer van je editor dezelfde documenten.
Nog een laatste kanttekening, en dat is degene die je echt bijt: --help en man kunnen elkaar tegenspreken. De man-pagina komt uit het distributiepakket, terwijl --help uit het programma voor je neus komt. Als je met de hand een nieuwere versie gecompileerd hebt, of in een container met een oudere handleiding zit, geloof dan --help.
8. Best practices
- Lees de regel onderaan het scherm.
Manual page cp(1) line 1vertelt je de naam en de sectie waar je werkelijk terechtkwam. De helft van alle "de handleiding klopt niet"-momenten is in werkelijkheid "ik lees een andere pagina dan ik denk". - Spring, scroll niet. Zoek in de pager naar een kop, verankerd aan het regelbegin:
/^EXAMPLES,/^EXIT STATUS,/^ENVIRONMENT. Gebruiknom langs de treffers te lopen. - Leer een SYNOPSIS lezen. Rechte haken betekenen optioneel, drie punten betekenen herhaalbaar, cursief betekent "hier jouw waarde", en meerdere regels betekenen meerdere werkwijzen. Twee minuten daar wint het van twintig minuten proberen.
- Controleer welke pagina's bestaan voordat je er een leest.
whatis naamkost een seconde en voorkomt dat je de C-functie leest terwijl je het commando wilde. - Onthoud sectie 5 voor configuratiebestanden. Als je een bestand bewerkt in plaats van een commando draait, is de pagina die je zoekt bijna altijd
man 5 iets. - Blader sectie 7 een keer bewust door.
man 7 hier,man 7 signalenman 7 globleren je elk een stuk Linux dat de meeste mensen langzaam en verkeerd oppikken. - Zet afbreken permanent uit. Zet
export MANOPT="--no-hyphenation --no-justification"in je shell-profiel zodat wat je kopieert is wat je typte. - Installeer de documentatiepakketten op een werkmachine. Op Debian en Ubuntu brengen
manpagesenmanpages-devde systeemaanroepen, de bibliotheekfuncties en de meeste overzichten uit sectie 7. Standaard staan ze niet op een server. - Forceer het origineel als het ertoe doet. Een vertaalde pagina kan achterlopen op de software. Gebruik
man -L C naamals je Engelse documentatie volgt of een pagina met iemand anders bespreekt. - Bouw de index opnieuw op na met de hand installeren. Als
aproposniets vindt maarmanwerkt, draai dansudo mandb. - Geef je eigen scripts een man-pagina. Alles wat in
/usr/local/binstaat op een server die je voor iemand anders beheert, verdient acht regels roff in/usr/local/share/man/man1. - Gebruik de hele documentatieverzameling, niet alleen
man. De man-pagina is het naslagwerk,--helpis de geheugensteun die altijd bij het geïnstalleerde programma hoort,helpis de enige bron voor shell-builtins,infois de GNU-cursus, en/usr/share/docbevat wat geen van alle bevat.
$ man man # the manual for the manual
$ man 7 man-pages # how manual pages are structured
$ man 1 intro # what section 1 is for (also 2 to 8)
$ man --help # the flag summary
$ info info # how to drive the info reader
Naar boven9. Veelgemaakte fouten
9.1 Mythe versus werkelijkheid
| Mythe | Werkelijkheid |
|---|---|
| "Er is een man-pagina per commando." | Het kunnen er meerdere zijn. passwd heeft er op een normaal systeem drie, in sectie 1, 1ssl en 5. |
"man doorzoekt secties op volgorde van nummer." |
Hij gebruikt de SECTION-regel in /etc/manpath.config, die begint met 1 n l 8 3 0 2 .... |
"apropos doorzoekt het naslagwerk." |
Het doorzoekt een regel per pagina, de NAME-samenvatting, in een index-cache. Voor de volledige tekst heb je man -K nodig. |
| "Geen man-pagina betekent dat het commando niet bestaat." | Het kan een shell-builtin zijn (cd, export), of alleen gedocumenteerd in --help of info. |
| "Man-pagina's zijn platte tekstbestanden." | Het is roff-bron, die groff elke keer opnieuw zet als je er een opent. |
| "De man-pagina hoort altijd bij het geïnstalleerde programma." | De pagina komt uit het pakket; het programma kan nieuwer zijn of zelf gecompileerd. --help is de versie die je draait. |
| "Je kunt een man-pagina niet pipen of greppen." | Dat kan wel. man laat alle opmaak weg zodra zijn uitvoer geen terminal is. |
"Je hebt man ls | col -b nodig voor platte tekst." |
Oud advies. man-db geeft je in een pipe al schone tekst, en moderne groff markeert met escape-reeksen in plaats van backspaces, die col -b toch niet weghaalt. |
9.2 Andere valkuilen om te vermijden
- Een optie kopieren die over een regel gebroken was. Je krijgt een U+2010-koppelteken in plaats van een ASCII-koppelteken, en een commando dat "overduidelijk bestaat" weigert te draaien. Zie paragraaf 7.1.
- Testen op afsluitcode 1. Een ontbrekende pagina sluit af met 16. Test op succes met
if man -w "$1" >/dev/null 2>&1, niet op een specifieke foutcode. MANPATHzetten zonder dubbele punt.MANPATH=/opt/tool/manvervangt het volledige zoekpad en verbergt elke systeempagina. SchrijfMANPATH=/opt/tool/man:of gebruikman -Mvoor een enkele aanroep.aproposvertrouwen in een container. Minimale images komen vaak zonder index, en soms zonder de man-pagina's zelf, omdat de verpakking/usr/share/manuitkleedt om ruimte te besparen.aproposvindt dan stilletjes niets.- Een pagina van boven naar beneden lezen. Een man-pagina is ingedeeld om op te zoeken, niet om te leren. Ga eerst naar EXAMPLES, dan naar die ene optie die je nodig hebt.
- Opgeven bij
man bash. Hij is enorm, maar ook compleet en doorzoekbaar./^ cdin de pager wint het van elke zoekopdracht op het web over het gedrag van shell-builtins. - De sectie vergeten als je zelf documentatie schrijft. "zie de handleiding van chmod" is dubbelzinnig;
chmod(1)ofchmod(2)niet. Gebruik de notatie, daar is hij voor.
10. Samenvatting
Het naslagwerk is de meest complete Linux-documentatie die je ooit zult hebben, het staat er al op, en het werkt zonder internetverbinding om drie uur 's nachts.
manis kort voor manual. Het bevat zelf geen documentatie: het zoekt een roff-bestand, maakt het op met groff, en stuurt het naar een pager.- Man-pagina's stammen uit de Unix Programmer's Manual van 1971, en de koppen die je vandaag leest (NAME, SYNOPSIS, DESCRIPTION, BUGS, SEE ALSO) komen daar rechtstreeks vandaan.
- Het naslagwerk is opgedeeld in genummerde secties naar soort: 1 commando's, 2 systeemaanroepen, 3 bibliotheekfuncties, 4 apparaten, 5 bestandsformaten, 6 spelletjes, 7 overzichten, 8 beheer.
- Sectie 5 is degene die de meeste mensen nooit ontdekken.
man 5 crontabenman 5 sshd_configdocumenteren de bestanden, niet de commando's. - De notatie
ls(1)is een verwijzing: paginanaam plus sectie. Lees hem, en schrijf hem. - Leer de SYNOPSIS-notatie een keer goed:
[ ]optioneel,...herhaalbaar, cursief betekent je eigen waarde, meerdere regels betekenen meerdere werkwijzen. - Spring in de pager met
/^EXAMPLESin plaats van te scrollen. whatistoont welke pagina's bestaan,aproposdoorzoekt hun samenvattingen van een regel, enman -Kdoorzoekt de volledige tekst.- Sectie 2 en 3 vormen het naslagwerk voor programmeurs: systeemaanroepen tegenover bibliotheekfuncties, met ERRORS en RETURN VALUE in plaats van EXIT STATUS, en de feature-test macro die je compiler nodig heeft staat in de SYNOPSIS.
- Pagina's kunnen vertaald zijn.
man -L nl naamvraagt om Nederlands,man -L C naamforceert het origineel, en buiten het Engels is de dekking dun. - Een ontbrekende pagina betekent vaak een ontbrekend pakket, geen ontbrekende documentatie. Op Debian en Ubuntu zitten de meeste secties 2, 3 en 7 in
manpagesenmanpages-dev. aproposleest een index-cache. Draaisudo mandbnadat je met de hand een pagina hebt geïnstalleerd.- De zoekvolgorde van secties komt uit
/etc/manpath.configen is niet 1, 2, 3. Dat verklaartman printfenman passwd. - Zet afbreken uit met
MANOPT, of de opties die je kopieert bevatten een teken dat je shell niet begrijpt. - Een ontbrekende pagina sluit af met 16, niet met 1. Shell-builtins hebben helemaal geen pagina: gebruik
help cd. - Weet waar
manophoudt, en merk op dat de vier documentatiecommando's verschillen in bron:--helpkomt uit het programma,manuit een documentatiepakket,helpuit de shell zelf, eninfouit de eigen handleiding van het GNU-project.
Dit is het spiekbriefje dat je wilt bewaren:
man NAME open the manual page
man 5 NAME open it in a specific section
man -a NAME show every matching page in turn
man -f NAME which pages exist (same as whatis)
man -k WORD search the one-line summaries (same as apropos)
man -wK -S 5 WORD full-text search, section 5, list the files
man -w NAME print the path of the page
man -l ./page.1 open a page file directly
man -L C NAME the original page, not a translation
man -t NAME > page.ps typeset for print instead of terminal
man -P cat NAME no pager, straight to stdout
man NAME | grep -A2 -- -x pipe it like any other text
apropos -s 1 'copy files' find a command by what it does
whatis -w 'ls*' wildcard search on page names
mandb rebuild the apropos/whatis index
manpath show where man looks for pages
/^EXAMPLES inside the pager: jump to a heading
n N next / previous match
g G q top, bottom, quit
export MANWIDTH=80 readable width
export MANSECT=8:5:1:7:2:3 your own section order
export MANOPT="--no-hyphenation --no-justification" copy-paste safe pages
apt install manpages manpages-dev sections 2, 3 and most of 7 (Debian)
dpkg -S /usr/share/man/... which package a page came from
help cd shell builtins, which have no manual page
help -s cd just the synopsis of a builtin
cmd --help the version you are actually running
info coreutils 'ls invocation' the full GNU manual (n p u Enter q)
Goed leren lezen in het naslagwerk is een van die stille vaardigheden die iemand die naar een server gokt onderscheiden van iemand die weet wat die server doet. Als jouw Linux-server iemand nodig heeft die de documentatie leest voordat hij de configuratie aanpast, en die aantekeningen achterlaat waar de volgende persoon mee verder kan, dan is dat precies het soort werk waar ik graag bij help.
Naar boven

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












