По какой причине сосуществуют rmdir(1) и rm(1)?

Я использую BSD и Linux каждый день, у меня никогда не было обстоятельства, при котором я должен использовать rmdir(1), а не rm(1). Какова цель существования rmdir?

4 ответа

Решение

Основная причина, вероятно, историческая. В старые, старые времена не было rmdir(2) а также mkdir(2) системные вызовы (мы обсуждаем 7-е издание UNIX™ здесь) и rmdir(1) была (по необходимости) корневая программа SUID, которая использовала unlink(2) системный вызов для удаления каталогов.

Руководства по UNIX 7-го издания доступны в Интернете по адресу http://cm.bell-labs.com/7thEdMan (последняя проверка 2017-04-23); Они также доступны по адресу http://plan9.bell-labs.com/7thEdMan (последняя проверка 2017-04-23). Кажется также, что есть хотя бы один альтернативный источник в Интернете - http://wolfram.schneider.org/bsd/7thEdManVol2/ - для статей в томе 2 со ссылкой на сайт FreeBSD для команд и системных вызовов в томе 1,

rm команда (обычная не-SUID программа) rmdir(1) Команда для удаления пустых каталогов. Он не мог сделать это сам; для этого требуются права суперпользователя. Итак rmdir(1) существовала команда (см. здесь ее исходный код в Unix V7) для удаления пустых каталогов, а rm Команда не удаляла пустые каталоги сама.

Использовать rm чтобы удалить каталоги, вы должны дать -r вариант.

Есть также аргумент симметрии. Вам нужна команда mkdir(1) создавать каталоги; кажется разумным иметь команду rmdir(1) отменить что mkdir(1) сделал. Плюс они (в наши дни) простые исполнители rmdir(2) а также mkdir(2) системные вызовы - да, еще в 7-м издании UNIX, mkdir(1) была также корневая программа SUID, используя mknod(2) вызов для создания узла каталога и link(2) призыв к созданию . а также .. Записи в каталоге.

"rm" не работает с каталогами. Вы должны либо использовать rmdir, либо указать ключ -r для рекурсивного удаления. Причина историческая: unlink а также rmdir являются отдельными системными вызовами и были с первых дней Unix.

Также rmdir удаляет только пустые каталоги. Если вы хотите убедиться, что вы не удаляете какие-либо дополнительные файлы в каталоге, rmdir является более безопасным, чем rm -r (кроме случаев, когда вы использовали псевдоним rm, так что вам всегда нужно подтверждать то, что вы удаляете, т.е. alias rm='rm -i' в ~/.bashrc или что вы используете).

Также, rmdir позволяет легко удалять пустые каталоги с выражениями globbing (wildcard). Например, чтобы удалить все пустые каталоги в /tmp не касаясь файлов или каталогов с содержимым:

cd /tmp ; rmdir *
Другие вопросы по тегам