Was ist /dev/null und warum kann ich hx nicht darauf verwenden?

Was ist /dev/null und warum kann ich hx nicht darauf verwenden?

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 /devsindPseudogerä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: try echo foo >/dev/null. Das Lesen daraus gibt einen leeren Bytestrom zurück (sofortiges EOF).
  • /dev/zero: eine unendliche Byte-Quelle 0x00. 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/nullmit 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/nullist 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/nullund 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/nullwird das Dateiende zurückgegeben, d. h. es verhält sich wie eine leere Datei.

Es gibt noch andere lustige Dinge, /devdie randomIhnen zufällige Daten liefern; nicht wirklich das, was Sie von einer „Datei“ erwarten :) Bemerkenswert ist, dass es /dev/randomsich 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/urandomSie erhalten eine scheinbar zufällige Zahl, die jedoch mit einer mathematischen Formel berechnet wird. Normalerweise /dev/urandomreicht 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/zeroum einen endlosen Strom von null (null) Bytes zu erhalten.

Antwort4

/dev/nullist 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 hxBefehl 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

fileDer Befehl bietet aber auch eine -sOption, die das Lesen unabhängig davon erzwingt ...

$ file -s /dev/null
/dev/null: empty

Vielleicht hxverfügt Ihr Befehl über eine ähnliche Option, die Sie verwenden können?

Der Grund, warum file(und möglicherweise hxauch Ihr Befehl) nicht-reguläre Dateien standardmäßig nicht identifiziert, wird in der Dokumentation der -sOption infileHandbuchseite, 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.

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 -sstattdessen zu Identifikationszwecken.


Nachtrag

Wenn Ihr hxisteine 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/zeroWenn 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 512Option 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.

verwandte Informationen