Commandline-programma's in Linux en andere Unix-achtigen maken gebruik van drie in- en uitvoerstromen: stdin, stdout en stderr. Stdin staat voor de invoer aan het programma, vaak toetsindrukken van de gebruiker.

Via een pipe (|) kan de uitvoer van één commando ook aan de invoer van een ander programma doorgegeven worden en via < kan de uitvoer uit een bestand gehaald worden. Stdout is de uitvoer van het programma. Standaard is dit het terminalvenster waarin het programma draait, maar stdout kan ook omgeleid worden naar een pipe of naar een bestand (met >).

Foutenuitvoer

De derde I/O-stroom is minder bekend en wordt niet door alle programma's gebruikt: stderr of de foutenuitvoer, die gebruikt wordt om foutmeldingen te tonen. Standaard komt die uitvoer ook in het terminalvenster waarin het programma draait terecht, maar ook deze kun je omleiden, bijvoorbeeld met 2> om de foutenuitvoer van een programa naar een bestand te schrijven of &> om zowel stdout als stderr naar een bestand te schrijven.

Omleiden is handig voor geautomatiseerde verwerking van fouten, maar als je een interactieve shell geopend hebt, zie je helemaal geen verschil tussen de normale uitvoer en foutenuitvoer omdat standaard zowel stdout als stderr op exact dezelfde manier op je terminalvenster getoond worden. Zou het niet handig zijn als alle foutenuitvoer (liefst automatisch) in het rood getoond wordt? Dit is een vaak voorkomende vraag en er bestaan verschillende manieren om dit aan te pakken. Heel wat van deze oplossingen werken echter niet voor programma's die invoer verwachten of verstoren de volgorde van de uitvoer.

Een klein maar handig programma dat het probleem wel goed oplost is hilite. Als je de foutenuitvoer van commando foo in het rood wil tonen, dan voer je gewoon hilite foo uit. Volgens de auteurs is het vooral bedoeld om foutmeldingen in software builds te laten opvallen: in plaats van make voer je dan gewoon hilite make uit en zie je het onmiddellijk als er iets misloopt tijdens het compileren.

Automatisch gekleurd

Een andere oplossing is stderred, die op de functie write() van libc inhaakt en aan alle uitvoer met file descriptor 2 (van stderr) escape-codes toevoegt om de uitvoer een rode kleur te geven. Stderred is geschreven als een shared library en kan eenvoudig zonder hercompilatie van je programma's gebruikt worden dankzij LD_PRELOAD. Maak bijvoorbeeld de volgende alias aan in je .bashrc:

$ alias stderred='LD_PRELOAD=/absolute/path/to/lib/stderred.so'

Als je daarna de foutenuitvoer van commando foo in het rood wil tonen, kan dat als volgt:

$ stderred foo

Je kunt de foutkleur ook automatisch voor alle programma's laten gebeuren door LD_PRELOAD in je .bashrc in te stellen:

export LD_PRELOAD="/absolute/path/to/lib/stderred.so"

Stderred werkt echter niet voor alle foutenuitvoer, bijvoorbeeld bij ls, dat write() niet rechtstreeks aanroept, maar de functies fprintf_unlocked() en error(), die op hun beurt write() aanroepen, maar dan in de context van libc zelf, waar LD_PRELOAD geen invloed meer heeft. De auteur van stderred legt het probleem (dat hilite niet heeft) op zijn website uit. De meeste programma's maken echter rechtstreeks gebruik van write(), en daarvoor is stderred (zeker als je het automatisch kunt gebruiken dankzij het aanpassen van LD_PRELOAD in je .bashrc) perfect.