Разрешения Unix немного странные, когда дело доходит до операции удаления.
Начнем с того, что удаление файла действительно включает в себя удаление ссылки на файл из каталога. Поскольку большинство файловых систем Unix допускают жесткие ссылки, файл может быть связан из более чем одного каталога, поэтому существует более одной ссылки. И когда вы удаляете ссылку, файл не удаляется, если нет других ссылок на него.
По этой причине фактический системный вызов, используемый для "удаления" файла, называется unlink
. Однако утилита командной оболочки, которая выполняет unlink, называется rm
, что является мнемоникой для "удаления".
Поскольку операция отмены связи изменяет каталог (удаляя запись каталога), а не файл, разрешение, необходимое для операции, - это разрешение на запись в каталог. Права доступа к самому файлу не имеют значения.
Однако, как выясняется, распространенной ошибкой является попытка удалить файл, который на самом деле не принадлежит вам, из каталога, в котором у вас есть разрешение на запись. (Точнее, ситуация не распространена, но в тех случаях, когда она существует, несколько ошибочно пытаются удалить файл.)
Для защиты системных администраторов от выстрелов собственных пальцев утилита rm
сначала проверяет, имеет ли лицо, которое ее вызывает, разрешение на запись в файл, даже если это разрешение не требуется для отсоединения файла. По понятным причинам, он делает эту проверку, прежде чем пытаться удалить файл.
Утилита rm
не проверяет, разрешено ли использование, чтобы отсоединить файл, потому что "проверка перед действием" обычно считается плохим стилем. Скорее, он выполняет желаемое действие и сообщает об ошибке, если операционная система возвращает ошибку. В этом случае ОС сообщит EACCES, потому что у пользователя нет прав на запись в каталог.
Печальным последствием является то, что если вы попытаетесь удалить файл, для которого у вас нет разрешения на запись, из каталога, в котором у вас нет разрешения на запись, rm
довольно бесполезно спросит вас, следует ли продолжить, а затем сообщит об ошибке.