Мені завжди було цікаво, чому команда для видалення всього в каталозі rm -rf
.
Чому немає прапорів, щоб зробити те саме rmdir
?
Чи не було б інтуїтивніше використовувати rmdir
для операцій з каталогами?
Мені завжди було цікаво, чому команда для видалення всього в каталозі rm -rf
.
Чому немає прапорів, щоб зробити те саме rmdir
?
Чи не було б інтуїтивніше використовувати rmdir
для операцій з каталогами?
Відповіді:
На початку файлової системи Unix (принаймні назад, за V7 днів до 1970 року) каталоги реалізовувались як спеціальні файли, і лише корінь міг використовувати mknod(2)
системний виклик, який їх створив, і лише корінь міг unlink(2)
мати спеціальний файл каталогу.
Ці засоби захисту існували для того, щоб підтримувати структуру файлової системи. Наприклад, якщо користувачеві було дозволено записувати в спеціальний файл каталогу, він може зробити його батьківський каталог ..
вказувати на себе (конкретно на власний i-вузол). Це створило б циркулярну посилання у файловій системі, яка була б поганою річчю. Звичайно, є й інші невідповідності, які можна зробити, це лише чіткий приклад.
Послідовність підтримувались такими програмами, як користувальницький простір, mkdir(1)
і rmdir(1)
які були коренем Set-UID, щоб вони могли робити привілейовані системні виклики від імені непривілейованого користувача. Коли до рекурсії було додано rm(1)
, команда delete буде виконуватись як поточний UID, а потім викликати rmdir(1)
виключно для видалення порожніх каталогів. Це все ще досить стандартний метод підвищення дозволу: не використовуйте більше дозволів, ніж вам потрібно.
Через деякий час mkdir(2)
і rmdir(2)
були додані в якості своїх власних системних викликів , але співвідношення між rm(1)
і rmdir(1)
залишається.
Особисто мені здається, що це більше задовольняє rmdir junk
та знаю, що найгірше, що я зробив, - це видалити порожній каталог.
rmdir
, вона все одно потребуватиме -r
прапор. ( rmdir -r junk
замість rm -r junk
, і rmdir junk
досі працює лише у випадку, якщо каталог порожній)
Це історично. rm
було зроблено для видалення посилань на файли, rmdir
робилося для видалення каталогів, паралельних до mkdir
. Багато років тому Unix rm
міг видаляти каталоги лише шляхом виклику rmdir
. Також не було rmdir(2)
системного виклику, rmdir
була програма, яка дзвонила unlink(2)
.
Список літератури:
Зрозуміло, це питання, але rm
видаляє файли, rmdir
видаляючи каталоги. Каталог - це файл, але файл особливого типу, тому їх має сенс rm
видаляти, але обробляти їх спеціально (тобто вимагати додаткової опції для активації.) З іншого боку, не всі файли - це каталоги, і немає сенсу IMHO rmdir
видаляти щось, що не є каталогом.
rm
видалити порожній каталог (за винятком рекурсивного режиму)?
-r
прапор, щоб увімкнути функцію спеціального файлу каталогу.
rmdir
видаляє каталоги,rm
видаляє. Чому було б інтуїтивно зрозумітиrmdir
видалення не-каталогів?