Linux is een interessant besturingssysteem dat een aantal virtuele apparaten host voor tal van doeleinden. Voor zover het programma’s betreft die in het systeem draaien, gedragen deze virtuele apparaten zich alsof het echte bestanden zijn. Programma’s kunnen gegevens opvragen en voeden vanuit deze bronnen. De gegevens worden gegenereerd door het OS in plaats van ze van een schijf te lezen.

Een voorbeeld hiervan is /dev/null. Het is een speciaal bestand dat aanwezig is in elk Linux systeem. Echter, in tegenstelling tot de meeste andere virtuele bestanden, wordt het gebruikt om te schrijven in plaats van te lezen. Wat je ook schrijft naar /dev/null zal worden weggegooid, vergeten in de leegte. Het staat bekend als het null apparaat in een UNIX systeem.

Waarom zou je iets willen weggooien in de leegte? Laten we eens kijken wat /dev/null is en hoe het gebruikt wordt.

Voorvereisten

Voordat we diep in het gebruik van /dev/null duiken, moeten we een goed begrip hebben van de stdout en stderr datastroom. Bekijk deze diepgaande gids over stdin, stderr, en stdout.

Laten we het even opfrissen. Wanneer een command-line programma wordt uitgevoerd, genereert het twee uitgangen. De uitvoer gaat naar stdout en de fout (indien gegenereerd) gaat naar stderr. Standaard zijn beide datastromen gekoppeld aan de terminal.

Het volgende commando drukt bijvoorbeeld de string binnen het dubbele aanhalingsteken af. Hier wordt de uitvoer opgeslagen in stdout.

$ echo “Hello World”

Het volgende commando toont ons de exit-status van het eerder uitgevoerde commando.

$ echo $?

Als de vorige opdracht met succes is uitgevoerd, is de exit-status 0. Anders zal de exit-status anders zijn. Wat gebeurt er als u een ongeldige opdracht probeert uit te voeren?

$ adfadsf
$ echo $?

Nu moeten we iets weten over de bestandsdescriptor. In het UNIX ecosysteem zijn dit gehele getallen die aan een bestand worden toegekend. Zowel stdout (file descriptor = 1) als stderr (file descriptor = 2) hebben een specifieke file descriptor. Met behulp van de bestandsdescriptor (1 en 2 in deze situatie), kunnen we de stdout en stderr omleiden naar andere bestanden.

Om te beginnen, het volgende voorbeeld leidt de stdout van het echo commando om naar een tekst bestand. Hier hebben we de bestandsdescriptor niet opgegeven. Als dat niet is opgegeven, gebruikt bash standaard stdout.

$ echo “Hello World” > log.txt

Het volgende commando leidt de stderr om naar een tekstbestand.

$ asdfadsa 2> error.txt

Gebruik /dev/null

Uitvoer omleiden naar /dev/null

Nu zijn we klaar om te leren hoe we /dev/null kunnen gebruiken. Laten we eerst eens kijken hoe we normale uitvoer en foutuitvoer kunnen filteren. In het volgende commando probeert grep te zoeken naar een string (hello, in dit geval) in de “/sys” directory.

$ grep -r hello /sys/

Het zal echter een heleboel fouten genereren omdat zonder root privilege, grep geen toegang heeft tot een aantal bestanden. In zo’n geval zal het resulteren in de foutmelding “Permission denied”. Nu, met behulp van de omleiding, kunnen we een duidelijkere uitvoer krijgen.

$ grep -r hello /sys/ 2> /dev/null

De uitvoer ziet er veel beter uit, toch? Niets. In dit geval heeft grep geen toegang tot veel bestanden en de bestanden die wel toegang hebben, bevatten niet de string “hello”.

In het volgende voorbeeld gaan we Google pingen.

$ ping google.com

We willen echter niet al die succesvolle ping-resultaten zien. In plaats daarvan willen we ons alleen richten op de fouten wanneer de ping Google niet kon bereiken. Hoe doen we dat?

$ ping google.com 1> /dev/null

Hier wordt de inhoud van stdout gedumpt naar /dev/null, zodat alleen de fouten overblijven.

Alle uitvoer omleiden naar /dev/null

In bepaalde situaties is de uitvoer misschien helemaal niet nuttig. Met behulp van redirection kunnen we alle uitvoer in de leegte dumpen.

$ grep -r hello /sys/ > /dev/null 2>&1

Laten we dit commando een beetje afbreken. Eerst dumpen we alle stdout naar /dev/null. Dan, in het tweede deel, vertellen we bash om stderr naar stdout te sturen. In dit voorbeeld, is er niets om uit te voeren. Als u echter in de war bent, kunt u altijd controleren of het commando met succes is uitgevoerd.

$ echo $?

De waarde is 2 omdat het commando veel fouten heeft gegenereerd.

Als u de neiging hebt om de bestandsdescriptor van stdout en stderr te vergeten, zal het volgende commando prima werken. Het is een meer gegeneraliseerd formaat van het vorige commando. Zowel stdout als stderr worden omgeleid naar /dev/null.

$ grep -r hello /sys/ &> /dev/null

Overige voorbeelden

Dit is een interessante. Ken je het gereedschap dd nog? Het is een krachtig gereedschap voor het converteren en kopiëren van bestanden. Leer meer over dd. Met dd kunnen we de sequentiële leessnelheid van uw schijf testen. Natuurlijk is dit geen nauwkeurige meting. Maar voor een snelle test is het wel handig.

$ dd if=<big_file> of=/dev/null status=progress bs=1M iflag=direct

Hier heb ik de Ubuntu 18.04.4 ISO gebruikt als het grote bestand.

Zo kunt u ook de downloadsnelheid van uw internetverbinding testen.

$ wget -O /dev/null <big_file_link>

Final thoughts

Hopelijk hebt u nu een goed begrip van wat dit /dev/null bestand is. Het is een speciaal apparaat dat, als er naar geschreven wordt, null weggooit en als er van gelezen wordt, null leest. Het ware potentieel van deze interessante functie ligt in interessante bash scripts.

Bent u geïnteresseerd in bash scripting? Bekijk de beginnershandleiding voor bash scripting.

Enjoy!

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.