Aus welchem ​​Grund existieren rmdir(1) und rm(1) gleichzeitig?

Aus welchem ​​Grund existieren rmdir(1) und rm(1) gleichzeitig?

Ich verwende BSD und Linux täglich und es ist mir noch nie passiert, dass ich rmdir(1) statt rm(1) verwenden musste. Was ist der Zweck der Existenz von rmdir?

Antwort1

Der Hauptgrund ist wahrscheinlich historischer Natur. In den alten, alten Tagen gab es keine rmdir(2)Systemaufrufe mkdir(2)(wir sprechen hier von UNIX™ 7th Edition) und es rmdir(1)gab (notwendigerweise) ein SUID-Root-Programm, das den unlink(2)Systemaufruf zum Entfernen von Verzeichnissen verwendete.

Die UNIX-Handbücher der 7. Ausgabe sind online verfügbar unterhttp://cm.bell-labs.com/7thEdMan(zuletzt geprüft am 23.04.2017); Sie sind auch verfügbar unterhttp://plan9.bell-labs.com/7thEdMan(zuletzt geprüft am 23.04.2017). Es scheint auch mindestens eine alternative Quelle online zu geben —http://wolfram.schneider.org/bsd/7thEdManVol2/— für die Artikel in Band 2, mit einem Link zurFreeBSDSite für die Befehle und Systemaufrufe in Band 1.

Der rmBefehl (ein normales Nicht-SUID-Programm) rief den rmdir(1)Befehl zum Entfernen leerer Verzeichnisse auf. Er konnte dies nicht selbst tun; dazu waren Root-Rechte erforderlich. Der rmdir(1)Befehl (sieheHierfür seinen Quellcode in Unix V7) existierte zum Entfernen leerer Verzeichnisse, und der rmBefehl entfernte selbst keine leeren Verzeichnisse.

Um rmVerzeichnisse zu entfernen, müssen Sie die -rOption angeben.

Es gibt auch ein Symmetrie-Argument. Sie benötigen einen Befehl, mkdir(1)um Verzeichnisse zu erstellen; es erscheint sinnvoll, einen Befehl zu haben, rmdir(1)um das mkdir(1)Geschehene rückgängig zu machen. Außerdem sind sie (heutzutage) einfache Executoren der Systemaufrufe the rmdir(2)und mkdir(2)– ja, damals in der 7. Edition von UNIX war es auch ein SUID-Root-Programm, das den Aufruf zum Erstellen eines Verzeichnisknotens und den Aufruf zum Erstellen der und Einträge im Verzeichnis mkdir(1)verwendete .mknod(2)link(2)...

Antwort2

"rm" funktioniert nicht mit Verzeichnissen. Sie müssen entweder rmdir verwenden oder den Schalter -r für eine rekursive Löschung angeben. Der Grund ist historisch: unlinkund rmdirsind separate Systemaufrufe und bestehen seit den frühen Tagen von Unix.

Antwort3

Außerdem entfernt rmdir nurleerVerzeichnisse. Wenn Sie sicherstellen möchten, dass Sie keine zusätzlichen Dateien in einem Verzeichnis löschen, rmdirist dies sicherer als rm -r(außer wenn Sie rm so aliasiert haben, dass Sie immer bestätigen müssen, was Sie löschen, d. h. alias rm='rm -i'in ~/.bashrc oder was auch immer Sie verwenden).

Antwort4

Außerdem rmdirkönnen leere Verzeichnisse mithilfe von Globbing-Ausdrücken (Platzhaltern) leicht entfernt werden. So entfernen Sie beispielsweise alle leeren Verzeichnisse, /tmpohne Dateien oder Verzeichnisse mit Inhalt zu berühren:

cd /tmp ; rmdir *

verwandte Informationen