Привет. Чем отличается команда rm от unlink? Давай смотреть. Обе эти команды умеют удалять, но в 99% ты используешь именно rm, потому что про unlink ты либо не слышал, либо тебе rm с головой хватает.



Есть ошибочное мнение, что unlink предназначен для удаления лишь ссылок, нифига, оно вполне может удалять обычные файлы. А если углубиться, то весь процесс удаления в Linux, это удаление ссылок.



Как устроен процесс удаления файлов в linux, расскажу в следующих постах, сегодня у нас битва rm vs unlink.



У unlink есть всего лишь два ключа запуска help и version. Очень ограниченный инструмент, но чем инструмент проще, тем проще его синтаксис.



# unlink /tmp/hardlink

# unlink /tmp/file



Софтина очень молчаливая — как мужик. После удаления, она промолчит и ничего не выведет на экран.



Команда unlink использует системную команду unlink, в то время как команда rm использует системный вызов unlinkat. Оба системных вызова практически одинаковы.



Unlink не умеет работать с wildcard и globbing шаблонами. Так же ты не сможешь с помощью нее удалить каталог.



Короче одни минусы. А нахрена тогда она нужна? Ооо брат, сейчас расскажу. Запускаем команду и пытаемся насильно удалить файл которого нет в каталоге:



rm -f test.txt



И получаем - НИЧЕГО. То есть rm -f не вернуло ошибку, что файл отсутствует. А если сделать так:



unlink test.txt



получаем ошибку:



unlink: cannot unlink 'test.txt': No such file or directory



То есть если мне нужно будет обработать результат выполнения команды rm -f, то я не буду достоверно знать, а существовал ли вообще файл. Ведь rm -f мне ничего не вернуло.



Короче с unlink можно гибче обрабатывать эксепшены в скриптах. А еще при использовании команды unlink отсутствует проверка безопасности. Она удалит файл, защищенный от записи. Хотя современная версия rm теперь тоже так умеет.



Оффтоп. Ну а если хочешь, чтобы твой файл никто не смог удалить, включая root, делай так:



chattr +i test.txt



chattr позволяет устанавливать и отключать атрибуты файлов, на уровне файловой системы не зависимо от стандартных (чтение, запись, выполнение).



Ключ i - сделает файл неизменяемым. Чтобы снять с файла этот аттрибут, в команде которая выше, замени знак «+» на «-».



Подытожим.
Для большинства повседневных задач конечно rm мастхев, но если ты пишешь софт для каких-то критичных систем, стоит не упускать из виду unlink.



Увидимся вечером.



tags: #linux #bash



💩 @bashdays