Ich war schon immer neugierig, warum der Befehl zum Löschen von allem in einem Verzeichnis rm -rf
ist .
Warum gibt es keine Flags, um dasselbe mit rmdir
zu tun ?
Wäre es nicht intuitiver, rmdir
zu verwenden für Verzeichnisoperationen?
Akzeptierte Antwort:
Im frühen Unix-Dateisystem (zumindest in den V7-Tagen um 1970) wurden Verzeichnisse als spezielle Dateien implementiert und nur root konnte mknod(2)
verwenden Systemaufruf, der sie erstellt hat, und nur root konnte unlink(2)
eine spezielle Verzeichnisdatei.
Diese Schutzmaßnahmen waren vorhanden, um die Dateisystemstruktur konsistent zu halten. Wenn es beispielsweise einem Benutzer erlaubt ist, in ein Verzeichnis eine spezielle Datei zu schreiben, könnte er sein übergeordnetes Verzeichnis ..
machen auf sich selbst zeigen (insbesondere auf seinen eigenen i-Knoten). Dies würde einen Zirkelverweis im Dateisystem erzeugen, was eine schlechte Sache wäre. Natürlich gibt es noch andere Ungereimtheiten, die man machen könnte, dies ist nur ein klares Beispiel.
Die Konsistenz wurde durch User-Space-Programme wie mkdir(1)
aufrechterhalten und rmdir(1)
die Set-UID-Root waren, damit sie die privilegierten Systemaufrufe im Namen eines nicht privilegierten Benutzers durchführen konnten. Als Rekursion zu rm(1)
hinzugefügt wurde , würde der Befehl remove als aktuelle UID ausgeführt und dann rmdir(1)
aufgerufen ausschließlich zum Entfernen leerer Verzeichnisse. Dies ist immer noch eine ziemlich übliche Methode zur Erhöhung von Berechtigungen:Verwenden Sie nicht mehr Berechtigungen als Sie benötigen.
Irgendwann später mkdir(2)
und rmdir(2)
wurden als eigene Systemaufrufe hinzugefügt, aber die Relation zwischen rm(1)
und rmdir(1)
bleibt.
Ich persönlich finde es etwas befriedigender, rmdir junk
zu verwenden und wissen, dass das Schlimmste, was ich getan habe, war, ein leeres Verzeichnis zu entfernen.