Wenn ich das tue: touch file; mv file /dev/null
als root, /dev/null
verschwindet. ls -lad /dev/null
führt zu keiner solchen Datei oder keinem solchen Verzeichnis. Dies unterbricht Anwendungen, die von /dev/null
SSH abhängen und durch Ausführen von gelöst werden können mknod /dev/null c 1 3; chmod 666 /dev/null
. Warum führt das Verschieben einer regulären Datei in diese spezielle Datei zum Verschwinden von /dev/null
?
Zur Verdeutlichung diente dies zu Testzwecken, und ich verstehe, wie der mv
Befehl funktioniert. Ich bin gespannt, warum ls -la /dev/null
vor dem Ersetzen durch eine reguläre Datei die erwartete Ausgabe angezeigt wird. Danach wird jedoch angezeigt, dass /dev/null
diese nicht vorhanden ist, obwohl eine Datei angeblich über den ursprünglichen mv
Befehl erstellt wurde und der Dateibefehl ASCII-Text anzeigt. Ich denke, dies muss eine Kombination des ls
Befehlsverhaltens sein, devfs
wenn eine nicht spezielle Datei ein Zeichen / eine spezielle Datei ersetzt. Dies ist unter Mac OS X der Fall. Das Verhalten kann unter anderen Betriebssystemen variieren.
/dev/null
.rm
Befehl.devfs
ist witzig über normale Dateien. Seltsamerweise haben Sie keinen Fehler bekommenmv
. Wie wäre es auf diese Weisetouch testfile; mv testfile /dev
:?mv
kann nur auf demselben Dateisystem atomar sein.Antworten:
Den Quellcode für mv finden Sie unter http://www.opensource.apple.com/source/file_cmds/file_cmds-220.7/mv/mv.c :
Beim ersten Durchlauf der while-Schleife
open(to, O_CREAT | O_EXCL | O_TRUNC | O_WRONLY, 0)
schlägt EEXIST fehl. Dann/dev/null
wird die Verbindung getrennt und die Schleife wiederholt. Wie Sie in Ihrem Kommentar bereits erwähnt haben, können keine regulären Dateien erstellt werden/dev
, sodass der nächste Durchlauf der Schleifeopen(to, O_CREAT | O_EXCL | O_TRUNC | O_WRONLY, 0)
weiterhin fehlschlagen wird.Ich würde einen Fehlerbericht bei Apple einreichen. Der
mv
Quellcode ist größtenteils unverändert gegenüber der FreeBSD-Version, aber da OSXs devfs dieses Nicht-POSIX-Verhalten bei regulären Dateien aufweist, sollte Apple das Problem behebenmv
.quelle
Das Verschieben einer Datei an den Speicherort einer bereits vorhandenen Datei ersetzt die vorhandene Datei. In diesem Fall wird die
/dev/null
Gerätedatei wie jede normale Datei ersetzt. Um dies zu vermeiden, verwenden Sie die Option-i
(interaktiv, warnt vor dem Überschreiben) oder-n
(kein Clober) fürmv
./dev/null
Erfüllt seine spezielle Funktion als Bit-Bucket erst dann, wenn das Gerät so wie es ist geöffnet wird. Wenn beispielsweise der>
Shell-Operator verwendet wird, wird die Datei geöffnet und dann abgeschnitten (nicht entfernt und ersetzt, was möglicherweise Ihren Erwartungen entspricht). Wie von casey erwähnt, ist der richtige Weg, eine Datei zu entfernen, mitrm
oder sogar mitunlink
.quelle
Ähm, hast du denn die spezielle Datei mit der normalen überschrieben? Was hast du erwartet?
dev/null
ist kein Verzeichnis, sondern eine Datei, die auf einnull
Gerät verweist . Wenn Siemv
etwas daran ändern, löschen Sie das Original und ersetzen es durch das, was Sie verschoben haben:quelle
/dev/null
, dass es nur die Datei ist, die ich verschoben habe.