Linux ist ein interessantes Betriebssystem, das einige virtuelle Geräte für zahlreiche Zwecke bereithält. Für Programme, die im System laufen, verhalten sich diese virtuellen Geräte so, als wären sie echte Dateien. Tools können Daten aus diesen Quellen anfordern und einspeisen. Die Daten werden vom Betriebssystem generiert, anstatt sie von einer Festplatte zu lesen.

Ein solches Beispiel ist /dev/null. Es ist eine spezielle Datei, die in jedem einzelnen Linux-System vorhanden ist. Im Gegensatz zu den meisten anderen virtuellen Dateien wird sie jedoch nicht zum Lesen, sondern zum Schreiben verwendet. Was auch immer Sie in /dev/null schreiben, wird verworfen, ins Leere vergessen. In einem UNIX-System ist es als Null-Gerät bekannt.

Warum sollte man etwas in die Leere werfen? Schauen wir uns an, was /dev/null ist und wie es verwendet wird.

Voraussetzungen

Bevor wir in die Verwendung von /dev/null eintauchen, müssen wir ein klares Verständnis des Datenstroms stdout und stderr haben. Schauen Sie sich diese ausführliche Anleitung zu stdin, stderr und stdout an.

Lassen Sie uns eine kurze Auffrischung vornehmen. Wenn ein Befehlszeilenprogramm ausgeführt wird, erzeugt es zwei Ausgaben. Die Ausgabe geht an stdout und der Fehler (falls erzeugt) geht an stderr. Standardmäßig sind diese beiden Datenströme mit dem Terminal verknüpft.

Der folgende Befehl gibt zum Beispiel die Zeichenfolge innerhalb der doppelten Anführungszeichen aus. Hier wird die Ausgabe in stdout gespeichert.

$ echo „Hello World“

Der nächste Befehl zeigt uns den Exit-Status des zuvor ausgeführten Befehls.

$ echo $?

Da der vorherige Befehl erfolgreich ausgeführt wurde, ist der Exit-Status 0. Andernfalls ist der Exit-Status anders. Was passiert, wenn Sie versuchen, einen ungültigen Befehl auszuführen?

$ adfadsf
$ echo $?

Nun müssen wir etwas über den Dateideskriptor wissen. Im UNIX-Ökosystem sind dies ganzzahlige Werte, die einer Datei zugeordnet sind. Sowohl stdout (Dateideskriptor = 1) als auch stderr (Dateideskriptor = 2) haben einen bestimmten Dateideskriptor. Mit Hilfe des Dateideskriptors (in diesem Fall 1 und 2) können wir stdout und stderr in andere Dateien umleiten.

Zum Beispiel wird im folgenden Beispiel stdout des echo-Befehls in eine Textdatei umgeleitet. Hier haben wir den Dateideskriptor nicht angegeben. Wenn nicht angegeben, verwendet die Bash standardmäßig stdout.

$ echo „Hello World“ > log.txt

Der folgende Befehl leitet den stderr in eine Textdatei um.

$ asdfadsa 2> error.txt

Verwendung von /dev/null

Umleitung der Ausgabe nach /dev/null

Nun sind wir bereit zu lernen, wie man /dev/null verwendet. Sehen wir uns zunächst an, wie wir normale Ausgaben und Fehler filtern können. Im folgenden Befehl wird grep versuchen, im Verzeichnis „/sys“ nach einer Zeichenkette (in diesem Fall „hello“) zu suchen.

$ grep -r hello /sys/

Es wird jedoch eine Menge Fehler erzeugen, da grep ohne Root-Rechte nicht auf eine Reihe von Dateien zugreifen kann. In einem solchen Fall kommt es zu der Fehlermeldung „Permission denied“. Jetzt, mit der Umleitung, können wir eine klarere Ausgabe erhalten.

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

Die Ausgabe sieht viel besser aus, oder? Nix da! In diesem Fall hat grep keinen Zugriff auf viele Dateien und die, auf die man zugreifen kann, enthalten nicht die Zeichenkette „hello“.

Im folgenden Beispiel werden wir Google anpingen.

$ ping google.com

Wir wollen jedoch nicht alle erfolgreichen Ping-Ergebnisse sehen. Stattdessen wollen wir uns nur auf die Fehler konzentrieren, wenn der Ping Google nicht erreichen konnte. Wie machen wir das?

$ ping google.com 1> /dev/null

Hier wird der Inhalt von stdout nach /dev/null umgeleitet, so dass nur die Fehler übrig bleiben.

Alle Ausgaben nach /dev/null umleiten

In bestimmten Situationen sind die Ausgaben vielleicht gar nicht nützlich. Mit der Umleitung können wir alle Ausgaben ins Leere werfen.

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

Lassen Sie uns diesen Befehl ein wenig aufbrechen. Zuerst wird der gesamte stdout nach /dev/null entsorgt. Dann, im zweiten Teil, weisen wir die Bash an, stderr nach stdout zu schicken. In diesem Beispiel gibt es nichts auszugeben. Wenn Sie jedoch verwirrt sind, können Sie jederzeit überprüfen, ob der Befehl erfolgreich ausgeführt wurde.

$ echo $?

Der Wert ist 2, weil der Befehl viele Fehler erzeugt hat.

Wenn Sie dazu neigen, den Dateideskriptor von stdout und stderr zu vergessen, ist der folgende Befehl genau richtig. Es ist ein allgemeineres Format des vorherigen Befehls. Sowohl stdout als auch stderr werden nach /dev/null umgeleitet.

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

Andere Beispiele

Dies ist ein interessantes Beispiel. Erinnern Sie sich an das dd-Tool? Es ist ein leistungsfähiges Werkzeug zum Konvertieren und Kopieren von Dateien. Erfahren Sie mehr über dd. Mit dd können wir die sequenzielle Lesegeschwindigkeit Ihrer Festplatte testen. Das ist natürlich keine genaue Messung. Aber für einen schnellen Test ist es ziemlich nützlich.

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

Hier habe ich die Ubuntu 18.04.4 ISO als große Datei verwendet.

In ähnlicher Weise kannst du auch die Downloadgeschwindigkeit deiner Internetverbindung testen.

$ wget -O /dev/null <big_file_link>

Abschließende Gedanken

Hoffentlich hast du eine klare Vorstellung davon, was diese /dev/null Datei ist. Es ist ein spezielles Gerät, das, wenn es beschrieben wird, verwirft und, wenn es gelesen wird, null liest. Das wahre Potenzial dieser interessanten Funktion liegt in interessanten Bash-Skripten.

Sind Sie an der Erstellung von Bash-Skripten interessiert? Schauen Sie sich den Leitfaden für Einsteiger in die Bash-Skripterstellung an.

Viel Spaß!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.