Sono sempre stato curioso di sapere perché il comando per eliminare tutto in una directory è rm -rf
.
Perché non ci sono flag per fare la stessa cosa con rmdir
?
Non sarebbe più intuitivo usare rmdir
per le operazioni di directory?
Risposta accettata:
Nei primi file system Unix (almeno ai tempi della V7 intorno al 1970) le directory erano implementate come file speciali e solo root poteva usare mknod(2)
la chiamata di sistema che li ha creati e solo root potrebbe unlink(2)
un file speciale di directory.
Queste protezioni erano in atto per mantenere coerente la struttura del filesystem. Ad esempio, se a un utente è stato consentito di scrivere in un file speciale di directory, potrebbe rendere la directory padre ..
punta a se stesso (in particolare al proprio i-node). Ciò creerebbe un riferimento circolare nel filesystem che sarebbe una brutta cosa. Naturalmente ci sono altre incongruenze che si potrebbero fare, questo è solo un chiaro esempio.
La coerenza è stata mantenuta da programmi in spazio utente come mkdir(1)
e rmdir(1)
che erano Set-UID root in modo che potessero effettuare le chiamate di sistema privilegiate per conto di un utente senza privilegi. Quando la ricorsione è stata aggiunta a rm(1)
, il comando di rimozione verrebbe eseguito come UID corrente e quindi richiamerebbe rmdir(1)
esclusivamente per rimuovere le directory vuote. Questo è ancora un metodo piuttosto standard per elevare i permessi:non usare più permessi del necessario.
Qualche tempo dopo mkdir(2)
e rmdir(2)
sono state aggiunte come proprie chiamate di sistema ma la relazione tra rm(1)
e rmdir(1)
rimane.
Personalmente, trovo un po' più soddisfacente rmdir junk
e sappi che il peggio che ho fatto è stato rimuovere una directory vuota.