Предполагая, что вы знаете, что целью является символическая ссылка, а не файл, есть ли разница между использованием rm
и unlink
удалением ссылки?
Предполагая, что вы знаете, что целью является символическая ссылка, а не файл, есть ли разница между использованием rm
и unlink
удалением ссылки?
Ответы:
Каждый раз, когда у вас возникают подобные вопросы, лучше всего провести небольшой тест, чтобы увидеть, что на самом деле происходит. Для этого вы можете использовать strace
.
$ touch file1
$ strace -s 2000 -o unlink.log unlink file1
$ touch file1
$ strace -s 2000 -o rm.log rm file1
Когда вы посмотрите на 2 полученных файла журнала, вы сможете «увидеть», что фактически делает каждый вызов.
При unlink
этом вызывается unlink()
системный вызов:
....
mmap(NULL, 106070960, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f6d025cc000
close(3) = 0
unlink("file1") = 0
close(1) = 0
close(2) = 0
exit_group(0) = ?
....
С rm
это немного другим путем:
....
ioctl(0, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
newfstatat(AT_FDCWD, "file1", {st_mode=S_IFREG|0664, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
geteuid() = 1000
newfstatat(AT_FDCWD, "file1", {st_mode=S_IFREG|0664, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
faccessat(AT_FDCWD, "file1", W_OK) = 0
unlinkat(AT_FDCWD, "file1", 0) = 0
lseek(0, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
close(0) = 0
close(1) = 0
close(2) = 0
exit_group(0) = ?
+++ exited with 0 +++
...
Системные вызовы unlink()
и unlinkat()
по сути те же самые, за исключением различий, описанных на этой странице руководства: http://linux.die.net/man/2/unlinkat .
Системный вызов unlinkat () работает точно так же, как unlink (2) или rmdir (2) (в зависимости от того, включает ли флаг флаги AT_REMOVEDIR), за исключением различий, описанных на этой странице руководства.
Если путь, указанный в pathname, является относительным, то он интерпретируется относительно каталога, на который ссылается дескриптор файла dirfd (а не относительно текущего рабочего каталога вызывающего процесса, как это делают unlink (2) и rmdir (2). ) для относительного пути).
Если путь, указанный в pathname, является относительным, а dirfd является специальным значением AT_FDCWD, тогда имя пути интерпретируется относительно текущего рабочего каталога вызывающего процесса (например, unlink (2) и rmdir (2)).
Если путь, указанный в pathname, является абсолютным, то dirfd игнорируется.
AT_FDCWD
, фактически нет никакой разницы между unlink
и unlinkat
.
POSIX указывает, что unlink
утилита вызывает unlink
функцию библиотеки C и ничего больше. Это не требует выбора. Если вы передадите правильный путь к чему-то, что не является каталогом, и если у вас есть права на запись в каталог, в котором находится этот объект, он unlink
будет удален.
rm
это традиционная команда Unix, которая имеет немного другой функциональности и не является расширенной unlink
(см. ниже).
Во-первых, rm
выполняет проверки безопасности. Если вы пытаетесь rm
использовать объект, для которого у вас нет прав на запись (что не имеет отношения к вашей способности удалить его: прямые разрешения есть!), rm
Тем не менее, вы отказываетесь, если -f
не указано иное. rm
обычно жалуется, если файл не существует, как делает unlink
; Однако -f
, rm
не жалуется. Это часто используется в Makefiles ( clean: @rm -f $(OBJS) ...
), поэтому make clean
не перестает работать, когда нечего удалять.
Во-вторых, rm
есть -i
возможность интерактивного подтверждения удаления.
В- третьих, rm
есть -r
рекурсивно удаления каталога, которая является то , что unlink
не требуется делать, поскольку функции библиотеки C не делает этого.
unlink
Утилита точно не урезанная rm
. Он выполняет подмножество того, что rm
делает, но у него есть семантика, которая является комбинацией rm
с -f
и без rm -f
.
Предположим, вы хотите просто удалить обычный файл независимо от его собственных прав доступа. Кроме того, предположим, что вы хотите, чтобы команда потерпела неудачу, если файл не существует, или по любой другой причине. Ни то, rm file
ни другое не rm -f file
соответствует требованиям. rm file
откажется, если файл не доступен для записи. Но rm -f file
не пожалеешь, если файл отсутствует. unlink file
делает работу
unlink
вероятно, был введен потому, что rm
он слишком умный: иногда вам просто нужна чистая unlink
семантика Unix : «пожалуйста, уберите эту запись из каталога, если разрешения для каталога позволяют» .
unlink
а не только с описанием различий.
С помощью одного файла rm и unlink выполняют одну и ту же задачу: удалите файл. Как определено POSIX, rm
и unlink
оба вызова системного вызова unlink () .
В GNU rm
он вызывает системный вызов unlinkat () , который эквивалентен функции unlink()
or rmdir (), за исключением случая, когда path указывает относительный путь.
Запись
В некоторых системах unlink
также можно удалить каталог. По крайней мере, в системе GNU, unlink
никогда не можете удалить имя каталога.