Zawsze byłem ciekawy, dlaczego jest to polecenie usuwania wszystkiego z katalogu rm -rf
.
Dlaczego nie ma flag, z którymi można by zrobić to samo rmdir
?
Czy korzystanie rmdir
z operacji na katalogach nie byłoby bardziej intuicyjne ?
Zawsze byłem ciekawy, dlaczego jest to polecenie usuwania wszystkiego z katalogu rm -rf
.
Dlaczego nie ma flag, z którymi można by zrobić to samo rmdir
?
Czy korzystanie rmdir
z operacji na katalogach nie byłoby bardziej intuicyjne ?
Odpowiedzi:
We wczesnym Unixowym systemie plików (przynajmniej w czasach V7 około 1970 roku) katalogi były implementowane jako pliki specjalne i tylko root mógł korzystać z mknod(2)
wywołania systemowego, które je utworzyło, a tylko root mógł unlink(2)
mieć specjalny plik katalogu.
Te zabezpieczenia zostały wprowadzone, aby zachować spójność struktury systemu plików. Na przykład, jeśli użytkownik mógł zapisać w specjalnym pliku katalogu, mógłby sprawić, aby jego katalog nadrzędny ..
wskazywał na siebie (w szczególności na własny i-węzeł). Spowodowałoby to utworzenie cyklicznego odwołania w systemie plików, co byłoby błędem. Oczywiście mogą istnieć inne niespójności, to tylko jasny przykład.
Konsystencja była utrzymywana przez programy przestrzeni użytkownika, jak mkdir(1)
i rmdir(1)
które były Set-UID korzeń, tak aby mogły one uprzywilejowanych wywołań systemowych w imieniu nieuprzywilejowany użytkownika. Po dodaniu rekurencji rm(1)
polecenie remove działałoby jako bieżący identyfikator UID, a następnie wywoływało rmdir(1)
wyłącznie w celu usunięcia pustych katalogów. Jest to nadal dość standardowa metoda podnoszenia uprawnień: nie używaj więcej uprawnień niż potrzebujesz.
Jakiś czas później mkdir(2)
i rmdir(2)
dodano jako własnych wywołań systemowych, ale z relacji rm(1)
i rmdir(1)
pozostaje.
Osobiście uważam to za odrobinę bardziej satysfakcjonujące rmdir junk
i wiem, że najgorsze, co zrobiłem, to usunięcie pustego katalogu.
rmdir
, nadal potrzebowałaby -r
flagi. ( rmdir -r junk
zamiast rm -r junk
i rmdir junk
nadal działa tylko wtedy, gdy katalog jest pusty)
To jest historyczne. rm
został stworzony, aby usunąć odniesienia do plików, rmdir
został stworzony, aby usunąć katalogi równolegle do mkdir
. Wiele lat temu Unix rm
mógł usuwać katalogi tylko poprzez inwokację rmdir
. Nie było też rmdir(2)
wywołania systemowego, rmdir
był to program, który wywołał unlink(2)
.
Bibliografia:
Jest to wyłącznie kwestia opinii, ale rm
usuwa pliki, a rmdir
katalogi. Katalog jest plikiem, ale specjalnym typem pliku, dlatego warto rm
je usuwać, ale traktować je specjalnie (tj. Wymagać dodatkowej opcji, aby włączyć tę funkcję). Z drugiej strony nie wszystkie pliki są katalogami, i IMHO nie ma sensu, rmdir
aby usuwać coś, co nie jest katalogiem.
rm
usunąć pustego katalogu (z wyjątkiem trybu rekurencyjnego)?
-r
flagi, aby włączyć funkcję specjalnego pliku katalogu.
rmdir
usuwa katalogi,rm
usuwa. Dlaczegormdir
usuwanie intuicyjnych katalogów byłoby intuicyjne ?