Ich habe in /dev gesucht und bin auf mehrere Dateien gestoßen, darunter null
. Ich wollte sehen, was in der Datei war, also habe ich es getan hx null
, aber nichts ist passiert und es wurde der Fehler ausgegeben File null is not a regular file
. Was verursacht diese Meldung?
Antwort1
Mehrere Objekte in /dev
sindPseudogeräteund werden direkt von Kernelfunktionen gehandhabt. Die am häufigsten verwendeten sind:
/dev/null
: die universelle Senke mit unendlicher Kapazität. Wird verwendet, um die Ausgabe zu verwerfen: tryecho foo >/dev/null
. Das Lesen daraus gibt einen leeren Bytestrom zurück (sofortiges EOF)./dev/zero
: eine unendliche Byte-Quelle0x00
. Wird oft als Eingabe verwendet, um Dinge mit Nullen zu überschreiben./dev/random
,/dev/urandom
: unendliche Quellen für zufällige Bytes.
Antwort2
Tatsächlich scheint keine der anderen Antworten die Frage zu beantworten, warum hx sich weigert, mit /dev/null zu arbeiten. Der Grund, warum hx so reagiert, ist einfach, dass es so programmiert wurde, dass es diese Fehlermeldung für Gerätedateien ausgibt.
Aushttps://github.com/krpors/hx/blob/develop/editor.c#L125:
if (!S_ISREG(statbuf.st_mode)) {
fprintf(stderr, "File '%s' is not a regular file\n", filename);
exit(1);
Das bedeutet, dass hx sich ausdrücklich weigert, mit allem zu arbeiten, was keine reguläre Datei ist. Ich glaube nicht, dass es einen guten Grund für diese Prüfung gibt – ohne sie würde ich erwarten, dass es /dev/null
mit hx funktioniert, in dem Sinne, dass hx eine leere Datei lesen würde und alle Aktualisierungen daran beim Speichern verloren gingen.
(Dies setzt voraus, dasshttps://github.com/krpors/hx/ist eigentlich das hx-Programm, von dem der Poster spricht)
Antwort3
/dev/null
ist im Grunde eine Möglichkeit, Informationen zu verwerfen.
Der Hauptzweck besteht schlicht und ergreifend darin, Dinge in die Vergessenheit lenken zu können.
echo 'duck' > /dev/null
unterdrückt die von gesendete Nachricht, echo 'duck'
da sie an gesendet /dev/null
und daher verworfen wird.
Dies wird hauptsächlich bei der Verwendung von Befehlen verwendet, die eine Ausgabe liefern, die Sie nicht sehen möchten.
Beim sofortigen Lesen /dev/null
wird das Dateiende zurückgegeben, d. h. es verhält sich wie eine leere Datei.
Es gibt noch andere lustige Dinge, /dev
die random
Ihnen zufällige Daten liefern; nicht wirklich das, was Sie von einer „Datei“ erwarten :) Bemerkenswert ist, dass es /dev/random
sich um echte Zufallsdaten handelt, die durch die Nutzung im System gesammelt werden (Zeit zwischen Tastenanschlägen und dergleichen), und dieser Pool kann ziemlich schnell erschöpft sein. /dev/urandom
Sie erhalten eine scheinbar zufällige Zahl, die jedoch mit einer mathematischen Formel berechnet wird. Normalerweise /dev/urandom
reicht das für Ihren Bedarf aus, aber für beispielsweise sehr starke Kryptoschlüssel ist es nicht gut genug.
Sie können auch lesen, /dev/zero
um einen endlosen Strom von null (null) Bytes zu erhalten.
Antwort4
/dev/null
ist eine Zeichengerätedatei, also eine Schnittstelle zu einem Gerätetreiber.
Dieses spezielle Gerät ist ein Dummy-Gerät (es stellt keine echte Hardware dar). Es ist speziell als bodenloser Papierkorb konzipiert; Sie können die Ausgabe beliebiger Programme hineinwerfen, falls Sie nicht möchten, dass sie auf dem Display oder sonst wo angezeigt wird.
- Inhaltlich, wenn Sie tatsächlich versucht haben,lesenDiese Datei (ja dudürfenLies es),es wirdstetsentspricht einer leeren Datei mit 0 Byte Länge.
Ich weiß nicht, was Ihr hx
Befehl ist, aber ich würde aus Ihrer Beschreibung schließen, dass es sich um einen Befehl zur Identifizierung des Dateityps handeltenach seinem Inhalt. Der Befehl, den ich auf meinem GNU/Linux-System für diese Aufgabe verwende, ist file
, und er stoppt auch, wenn er feststellt, dass die Datei keine normale Datei ist …
$ file /dev/null
/dev/null: character special
file
Der Befehl bietet aber auch eine -s
Option, die das Lesen unabhängig davon erzwingt ...
$ file -s /dev/null
/dev/null: empty
Vielleicht hx
verfügt Ihr Befehl über eine ähnliche Option, die Sie verwenden können?
Der Grund, warum file
(und möglicherweise hx
auch Ihr Befehl) nicht-reguläre Dateien standardmäßig nicht identifiziert, wird in der Dokumentation der -s
Option infile
Handbuchseite, nämlich...
- Das Lesen dieser Dateien kann Nebenwirkungen verursachen, die manchmal unerwünscht sind.
- Beim Lesen aus der FIFO-Pipe werden die darin enthaltenen Daten dauerhaft verbraucht. Sie können die gelesenen Daten nicht wieder in die Pipe zurückschieben.
- Das Lesen aus der Gerätedatei führt zu einer Geräteänderung …
- Beim Lesen vom Bandgerät verschiebt sich die Position des Bandkopfes.
- Das Lesen vom Gerät an der seriellen Schnittstelle führt dazu, dass gepufferte Eingabebytes verbraucht werden.
- Das Lesen von einem Zufallszahlengerät führt dazu, dass der Entropiepool des Systems erschöpft wird.
- Und viele mehr, abhängig vom Treiber des jeweiligen Geräts.
- Identifizieren dieser speziellen Dateiennach Inhalterfordert viel mehr Arbeit und viel weniger Sicherheit:
- Die Inhaltsgröße ist nicht im Voraus bekannt (oder erfordert spezielle systemspezifische
ioctl()
Aufrufe, um sie zu ermitteln). - In vielen Fällen funktioniert das Suchen nicht.
- Zum Erkennen von Dateitypen, die auf der Dateiende-Signatur basieren, muss das gesamte Dokument durchgelesen werden.
- Einige dieser Dateien gebenunendlichInhalt.
- Die Inhaltsgröße ist nicht im Voraus bekannt (oder erfordert spezielle systemspezifische
Falls Ihr Programm nicht für die erforderlichen Arbeiten ausgelegt ist, kann es den Inhalt nicht regulärer Dateien möglicherweise nicht erkennen und wird aus Sicherheitsgründen abgebrochen.
- Sollte das Programm ohne diese Sicherheitsüberprüfung fortgesetzt werden, kann dies zu einemaufhängen, AAbsturzoder schlimmer noch, das System zumnicht genügend Arbeitsspeicher; abhängig von der Ausgestaltung des jeweiligen Programms.
Wenn dies der Fall ist, handelt es sich um eine Einschränkung Ihres Programms. Verwenden Sie es file -s
stattdessen zu Identifikationszwecken.
Nachtrag
Wenn Ihr hx
isteine Art vonHex/BinärEditor;dann ist es besondersNICHT ratsamum damit spezielle Dateien zu öffnen, von denen Sie nichts wissen. HexRedakteurenormalerweise Vorspannunggesamte Dateiin den Speicher für Ihre Bearbeitungsvorgänge.
/dev/zero
Wenn Sie also versuchen, eine Gerätedatei mit unbegrenztem Inhalt (wie oder /dev/urandom
) oder sogar ein großes endliches Gerät (wie ) zu öffnen /dev/sda
, könnte Ihr System in einenNicht genügend Arbeitsspeicher, zur Wiederherstellung müssen Sie möglicherweise die gesamte Maschine zurücksetzen.
Die Sicherheitsüberprüfung, die Sie gerade ausgelöst haben, soll Sie wahrscheinlich vor diesem Szenario bewahren. (Wie bereits erwähnt: Die Inhaltsgröße der Gerätedatei ist nicht im Voraus bekannt – das Programm kann nicht im Voraus bestimmen, ob Sie über genügend Speicher verfügen, um sie zu laden oder nicht.)
Falls Sie auf jeden Fall nur einen „Blick“ auf den Dateikopf werfen möchten;hexadezimal verwendenZuschauerstattdessen, wiehexdump
(empfohlen) oder Old-Schoolod
. Zum Beispiel:
hexdump -C -n 512 /dev/null
(Inhalt wird leer sein)hexdump -C -n 512 /dev/urandom
(Der Inhalt wird jedes Mal ein anderes Kauderwelsch sein)
^ Die -n 512
Option beschränkt die Anzeige auf die ersten 512 Bytes. Aber selbst wenn Sie diese Option auslassen und mit einer endlosen Ausgabe bombardiert werden, müssen Sie nur drücken, um sie zu stoppen Ctrl+C.