Sono sempre stato curioso di sapere perché il comando per eliminare tutto in una directory è rm -rf
.
Perché non ci sono bandiere con cui fare la stessa cosa rmdir
?
Non sarebbe più intuitivo utilizzare rmdir
per le operazioni di directory?
Sono sempre stato curioso di sapere perché il comando per eliminare tutto in una directory è rm -rf
.
Perché non ci sono bandiere con cui fare la stessa cosa rmdir
?
Non sarebbe più intuitivo utilizzare rmdir
per le operazioni di directory?
Risposte:
Nei primi Unix File System (almeno nei giorni V7 intorno al 1970) le directory venivano implementate come file speciali e solo root poteva usare la mknod(2)
chiamata di sistema che le creava e solo root poteva unlink(2)
un file speciale di directory.
Queste protezioni erano in atto per mantenere coerente la struttura del filesystem. Ad esempio, se un utente fosse autorizzato a scrivere in un file speciale di directory, potrebbe fare in modo che la propria directory padre ..
punti a se stessa (in particolare il proprio i-node). Ciò creerebbe un riferimento circolare nel filesystem che sarebbe una cosa negativa. Naturalmente ci sono altre incongruenze che si potrebbero fare, questo è solo un chiaro esempio.
La coerenza è stata mantenuta dai programmi dello spazio utente come mkdir(1)
e rmdir(1)
che erano root Set-UID in modo che potessero effettuare chiamate di sistema privilegiate per conto di un utente non privilegiato. Quando veniva aggiunta la ricorsione rm(1)
, il comando remove veniva eseguito come UID corrente e quindi chiamava rmdir(1)
esclusivamente per la rimozione di directory vuote. Questo è ancora un metodo piuttosto standard di elevazione delle autorizzazioni: non utilizzare più autorizzazioni di quelle necessarie.
Qualche tempo dopo mkdir(2)
e rmdir(2)
sono stati aggiunti come il loro sistema chiama ma la relazione tra rm(1)
e rmdir(1)
rimane.
Personalmente, trovo un po 'più soddisfacente rmdir junk
e so che il peggio che ho fatto è stato rimuovere una directory vuota.
rmdir
, avrebbe comunque bisogno di un -r
flag. ( rmdir -r junk
invece di rm -r junk
, e funziona rmdir junk
ancora solo se la directory è vuota)
È storico. rm
è stato creato per rimuovere i riferimenti ai file, è rmdir
stato creato per rimuovere le directory, parallelamente a mkdir
. Molti anni fa, Unix rm
poteva solo rimuovere le directory invocando rmdir
. Inoltre non c'era una rmdir(2)
chiamata di sistema, rmdir
era un programma che chiamava unlink(2)
.
Riferimenti:
È solo una questione di opinione, ma rm
rimuove i file mentre rmdir
rimuove le directory. Una directory è un file, ma un tipo speciale di file, quindi ha senso rm
rimuoverli, ma trattarli in modo speciale (cioè richiedere un'opzione aggiuntiva per abilitare la funzionalità). D'altra parte, non tutti i file sono directory, e non ha senso IMHO per rmdir
rimuovere qualcosa che non è una directory.
rm
rimuovere una directory vuota (tranne che in modalità ricorsiva)?
-r
flag per abilitare la funzione di file speciale della directory.
rmdir
rimuove le directory,rm
rimuove. Perché sarebbe intuitivormdir
rimuovere le non-directory?