rmdirentfernt Verzeichnisse, rmentfernt. Warum sollte es intuitiv sein rmdir, Nicht-Verzeichnisse zu entfernen?
Stéphane Chazelas
5
Weil es nicht so ist. Sie sind 40 Jahre zu spät, um diese Frage zu stellen, und Sie fragen die falschen Leute.
user207421
Antworten:
25
Im frühen Unix-Dateisystem (zumindest in den V7-Tagen um 1970) wurden Verzeichnisse als spezielle Dateien implementiert, und nur root konnte den mknod(2)Systemaufruf verwenden, der sie erstellte, und nur root konnte unlink(2)eine verzeichnisspezifische Datei erstellen.
Diese Schutzmechanismen waren vorhanden, um die Dateisystemstruktur konsistent zu halten. Wenn ein Benutzer beispielsweise in eine verzeichnisspezifische Datei schreiben darf, kann er das übergeordnete Verzeichnis ..auf sich selbst verweisen lassen (insbesondere auf seinen eigenen i-Knoten). Dies würde einen Zirkelverweis im Dateisystem erzeugen, der eine schlechte Sache wäre. Natürlich kann man auch andere Unstimmigkeiten feststellen, dies ist nur ein klares Beispiel.
Die Konsistenz wurde von User-Space-Programmen wie mkdir(1)und rmdir(1)Set-UID-Root -Programmen aufrechterhalten , damit diese die privilegierten Systemaufrufe für einen nichtprivilegierten Benutzer durchführen konnten. Wenn eine Rekursion hinzugefügt wurde, rm(1)wurde der Befehl remove als aktuelle UID ausgeführt und anschließend rmdir(1)nur zum Entfernen leerer Verzeichnisse aufgerufen . 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)als eigene Systemaufrufe wurden hinzugefügt, aber die Beziehung zwischen rm(1)und rmdir(1)bleibt.
Persönlich finde ich es ein bisschen befriedigender rmdir junkund weiß, dass das Schlimmste, was ich getan habe, das Entfernen eines leeren Verzeichnisses war.
Zu dem letzten Satz: Wenn die rekursive Löschoperation aktiviert rmdirwäre, würde sie vermutlich immer noch ein -rFlag benötigen . ( rmdir -r junkanstelle von rm -r junkund rmdir junkfunktioniert immer noch nur, wenn das Verzeichnis leer ist)
user253751
7
Es ist historisch. rmwurde gemacht, um die Verweise auf Dateien rmdirzu entfernen , wurde gemacht, um Verzeichnisse zu entfernen, parallel zu mkdir. Vor vielen Jahren konnte Unix rmVerzeichnisse nur durch Aufrufen entfernen rmdir. Es gab auch keinen rmdir(2)Systemaufruf, es rmdirwurde ein Programm aufgerufen unlink(2).
Eine reine Ansichtssache, rmentfernt aber Dateien, während rmdirVerzeichnisse entfernt werden. Ein Verzeichnis ist eine Datei, aber ein spezieller Dateityp rm. Daher ist es sinnvoll , sie zu entfernen, aber speziell zu behandeln (dh eine zusätzliche Option zum Aktivieren der Funktion zu erfordern.). Auf der anderen Seite sind nicht alle Dateien Verzeichnisse. und es macht IMHO keinen Sinn rmdir, etwas zu entfernen, das kein Verzeichnis ist.
Wenn dies der Fall war, warum kann dann kein rmleeres Verzeichnis entfernt werden (außer im rekursiven Modus)?
user253751
Aus demselben Grund kann kein vollständiges Verzeichnis entfernt werden. Das -rFlag ist erforderlich , um die Funktion für Verzeichnis-Sonderdateien zu aktivieren.
Darwin von Corax
1
Zirkuläre Argumentation dort ...
user253751
Ich würde sagen, meine Argumentation hat eine Exzentrizität >> 1 ...
rmdir
entfernt Verzeichnisse,rm
entfernt. Warum sollte es intuitiv seinrmdir
, Nicht-Verzeichnisse zu entfernen?Antworten:
Im frühen Unix-Dateisystem (zumindest in den V7-Tagen um 1970) wurden Verzeichnisse als spezielle Dateien implementiert, und nur root konnte den
mknod(2)
Systemaufruf verwenden, der sie erstellte, und nur root konnteunlink(2)
eine verzeichnisspezifische Datei erstellen.Diese Schutzmechanismen waren vorhanden, um die Dateisystemstruktur konsistent zu halten. Wenn ein Benutzer beispielsweise in eine verzeichnisspezifische Datei schreiben darf, kann er das übergeordnete Verzeichnis
..
auf sich selbst verweisen lassen (insbesondere auf seinen eigenen i-Knoten). Dies würde einen Zirkelverweis im Dateisystem erzeugen, der eine schlechte Sache wäre. Natürlich kann man auch andere Unstimmigkeiten feststellen, dies ist nur ein klares Beispiel.Die Konsistenz wurde von User-Space-Programmen wie
mkdir(1)
undrmdir(1)
Set-UID-Root -Programmen aufrechterhalten , damit diese die privilegierten Systemaufrufe für einen nichtprivilegierten Benutzer durchführen konnten. Wenn eine Rekursion hinzugefügt wurde,rm(1)
wurde der Befehl remove als aktuelle UID ausgeführt und anschließendrmdir(1)
nur zum Entfernen leerer Verzeichnisse aufgerufen . 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)
undrmdir(2)
als eigene Systemaufrufe wurden hinzugefügt, aber die Beziehung zwischenrm(1)
undrmdir(1)
bleibt.Persönlich finde ich es ein bisschen befriedigender
rmdir junk
und weiß, dass das Schlimmste, was ich getan habe, das Entfernen eines leeren Verzeichnisses war.quelle
rmdir
wäre, würde sie vermutlich immer noch ein-r
Flag benötigen . (rmdir -r junk
anstelle vonrm -r junk
undrmdir junk
funktioniert immer noch nur, wenn das Verzeichnis leer ist)Es ist historisch.
rm
wurde gemacht, um die Verweise auf Dateienrmdir
zu entfernen , wurde gemacht, um Verzeichnisse zu entfernen, parallel zumkdir
. Vor vielen Jahren konnte Unixrm
Verzeichnisse nur durch Aufrufen entfernenrmdir
. Es gab auch keinenrmdir(2)
Systemaufruf, esrmdir
wurde ein Programm aufgerufenunlink(2)
.Verweise:
quelle
Eine reine Ansichtssache,
rm
entfernt aber Dateien, währendrmdir
Verzeichnisse entfernt werden. Ein Verzeichnis ist eine Datei, aber ein spezieller Dateityprm
. Daher ist es sinnvoll , sie zu entfernen, aber speziell zu behandeln (dh eine zusätzliche Option zum Aktivieren der Funktion zu erfordern.). Auf der anderen Seite sind nicht alle Dateien Verzeichnisse. und es macht IMHO keinen Sinnrmdir
, etwas zu entfernen, das kein Verzeichnis ist.quelle
rm
leeres Verzeichnis entfernt werden (außer im rekursiven Modus)?-r
Flag ist erforderlich , um die Funktion für Verzeichnis-Sonderdateien zu aktivieren.