Ga naar hoofdinhoud

Streams & Omleiding

Elk programma in Linux communiceert via standaardstromen: vaste kanalen voor invoer en uitvoer. Door die stromen om te leiden en commando's aan elkaar te koppelen via pipes bouw je krachtige bewerkingen op met simpele bouwstenen.

De drie standaardstromen

Wanneer een programma opstart, krijgt het automatisch drie open kanalen mee:

Standaardstromen

StroomNummerStandaard verbonden metBetekenis
stdin0ToetsenbordInvoer die het programma leest
stdout1TerminalNormale uitvoer
stderr2TerminalFoutmeldingen

Stdout en stderr verschijnen standaard allebei in je terminal, maar ze zijn aparte kanalen. Dat onderscheid wordt belangrijk zodra je ze wilt omleiden.

Voorbeeld: ls schrijft zijn uitvoer naar stdout. Als je een niet-bestaande map opvraagt, schrijft het de foutmelding naar stderr:

ls /bestaande-map # Uitvoer gaat naar stdout
ls /bestaat-niet # Fout gaat naar stderr

In de terminal zie je beide, maar als je gaat omleiden, kun je ze apart behandelen.


Uitvoer omleiden naar een bestand

Met > en >> stuur je stdout naar een bestand in plaats van naar de terminal.

Overschrijven met >

ls -la > overzicht.txt # Schrijf uitvoer naar bestand (overschrijft)
echo "Hallo" > bestand.txt # Maak bestand aan met die tekst

Als het bestand al bestaat, wordt het volledig overschreven. Als het niet bestaat, wordt het aangemaakt.

Toevoegen met >>

echo "Regel 1" > bestand.txt # Maak bestand aan
echo "Regel 2" >> bestand.txt # Voeg toe aan het bestand
cat bestand.txt
# Regel 1
# Regel 2

>> voegt toe aan het einde — handig voor logbestanden of wanneer je de bestaande inhoud wilt bewaren.


Stderr omleiden

Foutmeldingen gaan naar stderr (kanaal 2). Je kunt ze apart omleiden:

apt install nano 2> fouten.txt # Sla foutmeldingen op in bestand
apt install nano 2>> fouten.log # Voeg foutmeldingen toe aan logbestand

Stdout én stderr samen omleiden

apt install nano > alles.log 2>&1 # Stuur stderr naar dezelfde plek als stdout
apt install nano &> alles.log # Kortere notatie, zelfde resultaat

2>&1 betekent: "stuur kanaal 2 (stderr) naar dezelfde bestemming als kanaal 1 (stdout)". De volgorde is belangrijk — 2>&1 moet achteraan staan.

Uitvoer weggooien

Soms wil je de uitvoer van een commando helemaal negeren:

commando 2> /dev/null # Negeer foutmeldingen
commando > /dev/null 2>&1 # Negeer stdout én stderr

/dev/null is een speciaal apparaatbestand dat alles weggooit wat erin geschreven wordt. Het heet ook wel de "bitton" van Linux.


Pipes

Een pipe (|) verbindt de stdout van het ene commando met de stdin van het volgende. Zo ketting je commando's aan elkaar en bouw je verwerkingsstromen op.

Pipeline

ls -l | less # Blader door een lange bestandslijst
cat logfile.txt | grep "ERROR" # Zoek ERROR-regels in een logbestand
ls -l ──stdout──► less
(leest het als invoer)

Je kunt meerdere pipes combineren:

cat /etc/passwd | grep bash | wc -l
# 1. cat leest /etc/passwd
# 2. grep filtert de regels met 'bash'
# 3. wc -l telt het aantal resterende regels

Het krachtige van pipes is dat je kleine, gefocuste commando's combineert tot iets complexers — zonder tussenliggende bestanden aan te maken. Elk commando doet één ding goed; de pipe lijmt ze samen.


Overzicht

SyntaxWat het doet
commando > bestandStdout omleiden naar bestand (overschrijven)
commando >> bestandStdout toevoegen aan bestand
commando 2> bestandStderr omleiden naar bestand
commando 2>&1Stderr samenvoegen met stdout
commando &> bestandStdout én stderr naar bestand
commando > /dev/nullStdout weggooien
commando1 | commando2Pipe: stdout van 1 naar stdin van 2