@ slm ♦ Ответы соответствуют этому вопросу, но этот вопрос отличается, он говорит: «Предполагая, что вы знаете, что цель является символической ссылкой, а не файлом».
Стефан Гурихон
Не похоже, что вы приняли ответ здесь @IQAndreas. Пожалуйста, сделайте это, если они вам помогли.
Серый
Ответы:
56
Каждый раз, когда у вас возникают подобные вопросы, лучше всего провести небольшой тест, чтобы увидеть, что на самом деле происходит. Для этого вы можете использовать strace.
Системные вызовы 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.
Бармар
6
Мне очень приятно читать этот ответ, потому что я просто «научился ловить рыбу» мощным и гибким способом, когда я часто ловлю рыбу или иногда я «учусь ловить рыбу» основным способом на SO :-)
мудрец
22
POSIX указывает, что unlinkутилита вызывает unlinkфункцию библиотеки C и ничего больше. Это не требует выбора. Если вы передадите правильный путь к чему-то, что не является каталогом, и если у вас есть права на запись в каталог, в котором находится этот объект, он unlinkбудет удален.
rmэто традиционная команда Unix, которая имеет немного другой функциональности и не является расширенной unlink(см. ниже).
Во-первых, rmвыполняет проверки безопасности. Если вы пытаетесь rmиспользовать объект, для которого у вас нет прав на запись (что не имеет отношения к вашей способности удалить его: прямые разрешения есть!), rmТем не менее, вы отказываетесь, если -fне указано иное. rmобычно жалуется, если файл не существует, как делает unlink; Однако -f, rmне жалуется. Это часто используется в Makefiles ( clean: @rm -f $(OBJS) ...), поэтому make cleanне перестает работать, когда нечего удалять.
В- третьих, 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а не только с описанием различий.
Wildcard
19
С помощью одного файла rm и unlink выполняют одну и ту же задачу: удалите файл. Как определено POSIX, rmи unlinkоба вызова системного вызова unlink () .
В GNU rmон вызывает системный вызов unlinkat () , который эквивалентен функции unlink()or rmdir (), за исключением случая, когда path указывает относительный путь.
Запись
В некоторых системах unlinkтакже можно удалить каталог. По крайней мере, в системе GNU, unlinkникогда не можете удалить имя каталога.
Ответы:
Каждый раз, когда у вас возникают подобные вопросы, лучше всего провести небольшой тест, чтобы увидеть, что на самом деле происходит. Для этого вы можете использовать
strace
.Разорвать связь
комната
Когда вы посмотрите на 2 полученных файла журнала, вы сможете «увидеть», что фактически делает каждый вызов.
Сломать
При
unlink
этом вызываетсяunlink()
системный вызов:С
rm
это немного другим путем:Системные вызовы
выдержкаunlink()
иunlinkat()
по сути те же самые, за исключением различий, описанных на этой странице руководства: http://linux.die.net/man/2/unlinkat .источник
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
никогда не можете удалить имя каталога.источник