Ich habe immer an /dev/null
ein Schwarzes Loch gedacht , so dass alle Daten, die ich dorthin sende, nicht zurückgesendet werden. Es gibt jedoch ein Problem mit dieser Definition. Laut Wikipedia:
/ dev / null ist eine spezielle Datei, kein Verzeichnis, daher kann man mit dem Unix-Befehl mv keine Dateien hinein verschieben.
Warum kann ich nach dieser Definition mv
dort stopfen? Zum Beispiel kann ich leicht tun:
# touch oi
# mv oi /dev/null
Was ist da los?
Antworten:
Wenn Sie versuchen, etwas unter einem einfachen Benutzer (nicht root) nach / dev / null zu verschieben, wird eine
Permission denied
Fehlermeldung angezeigt, damv something /dev/null
tatsächlich versucht wird, etwas zu löschen/dev/null
und dann zu dem zu verschiebensomething
, was/dev/null
war.Wenn Sie es unter root zu tun , werden versuchen, es wird löschen
/dev/null
(und dann die Datei , indem Sie in ihm Platz zur Verfügung gestellt bewegen)! Sie können es wiederherstellen, indem Sie Folgendes neu starten oder Folgendes in eine Root-Shell (unter Linux) eingeben:mknod /dev/null c 1 3; chmod a+w /dev/null
oder in BSD :mknod /dev/null c 3 2; chmod a+w /dev/null
.quelle
Wenn Sie dies tun:
Sie machen tatsächlich das Äquivalent der folgenden
quelle
Das kannst du nicht
quelle
/dev/null
ist eine spezielle Zeichendatei, was bedeutet, dass es sich um eine inhaltslose Datei handelt, die als in der Lage markiert ist, Byte-Streams zu quellieren und zu speichern. Was mit diesen Streams passiert, wird durch ihre Gerätenummern bestimmt. Auf meinem BSD-System im Moment:Die Gerätenummern sind 3,2 (die Hauptnummer ist 3, die Nebennummer ist 2). Ich kann andere
/dev/null
ähnliche Dateien erstellenmknod /dev/nil c 3 2
, wobei c bedeutet, dass ich eine spezielle Zeichendatei möchte. Auf BSD-Systemen wird das Gerätenummernpaar jedoch dynamisch erstellt und ist beim nächsten Start möglicherweise nicht dasselbe.Um zu sehen, wie diese Fakten in der Praxis zutreffen:
Linux verwendet das Dur-Moll-Paar 1,3 und
mknod /dev/null c 1 3
erstellt dort Ihre Datei neu.Zeichenspezialdateien sind in vielerlei Hinsicht wie die meisten anderen Dateien und können gelöscht werden, wenn Sie über die Berechtigungen verfügen. Die Verwendung
mv
in einer Gerätedatei ist genauso, als ob Sie eine reguläre Datei verschoben hätten. Dies bedeutet, dass Sie eine völlig neue Datei erhalten, die Sie anhand der Inodes erkennen können. Zum Beispiel (diesmal Mac OS, aber alle * nixes verhalten sich hier gleich):Sehen Sie, wie sich der mit dem Dateinamen verknüpfte Inode
def
nach der Verwendung geändert hatmv
, wobei die alte Datei einfach gelöscht wurde. Als ich jedoch die Ausgabeecho
in die genannte Datei schriebdef
, blieb der Inode derselbe. Ihrmv
Fehler schlägt also entweder fehl, wahrscheinlich wenn Sie nicht root sind, oder Sie löschen die Datei und legen eine neue Datei unter den Pfad/dev/null
, wofür dieses spezielle Zeichen nicht gedacht ist.quelle
cp -R /dev/null /some/other/null
. Dies ist POSIX-kompatibel ( mkssoftware.com/docs/man1/cp.1.asp ), sodass es unter praktisch jedem Unix funktioniert.Warum
mv
eine Datei/dev/null
(auch wenn es möglich ist), wenn Sie sie einfach löschen könnten?Ist
/dev/null
es sicherlich nützlicher und als Ziel für Ausgabedaten gedacht ?quelle
Shell Scripting ist eine häufige Verwendung:
cat somefile >/dev/null 2>&1
Manchmal möchten Sie keine Fehler sehen / anzeigen usw.
quelle
/ dev / null ist wie ein Schwarzes Loch und / oder eine leere Datei. umwerfend! Sie können hier alles hineinstecken und von dort nichts bekommen.
quelle