Каково различие между 'комнатой', и 'удалите связь'?

Как точно сделать, это во многом зависит от Вашей установки шпульки печати, CUPS является одной из многих опций здесь. (Да, печатение в Unix является своего рода черной магией).

57
24.08.2014, 22:03
3 ответа

Всякий раз, когда у Вас возникают подобные вопросы, лучше всего придумать небольшой тест, чтобы увидеть, что же на самом деле происходит. Для этого можно использовать strace .

unlink

$ touch file1
$ strace -s 2000 -o unlink.log unlink file1

rm

$ touch file1
$ strace -s 2000 -o rm.log rm file1

Когда вы смотрите на 2 результирующих лог-файла, вы можете "увидеть", что на самом деле делает каждый вызов.

Breakdown

With unlink it's invoking the unlink() system call:

....
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)                           = ?
....

With rm it's a little different path:

....
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 +++
...

The system calls unlink() and unlinkat() are essentially the same except for the differences described in this man page: http://linux.die.net/man/2/unlinkat.

выдержка

Системный вызов unlinkat() работает точно так же, как и любой другой. unlink(2) или rmdir(2) (в зависимости от того, включены ли флаги в состав флаг AT_REMOVEDIR) за исключением отличий, описанных в данном руководстве. страница.

Если отчество, данное в отчестве, является относительным, то оно интерпретируется как относительно директории, на которую ссылается файловый дескриптор dirfd (а не относительно текущей рабочей директории вызова процесс, как это делается с помощью unlink(2) и rmdir(2) для относительного Пафос).

Если отчество, указанное в отчестве, является относительным и dirfd - специальным значение AT_FDCWD, затем путь интерпретируется относительно текущего значения рабочий каталог вызывающего процесса (например, unlink(2) и rmdir(2)).

Если отчество, указанное в отчестве, является абсолютным, то dirfd игнорируется.

62
27.01.2020, 19:32

С одним файлом rm и unlink выполните ту же задачу, удалите файл. Как определено в POSIX, rm и unlink обращаются к системному вызову unlink().

В GNU rm, он вызывает системный вызов unlinkat(), что эквивалентно системному вызову unlink() или rmdir(), за исключением случая, когда путь задает относительный путь. Примечание

Примечание

В некоторых системах unlink также может удалить каталог. По крайней мере, в системе GNU, unlink никогда не может удалить имя каталога.

19
27.01.2020, 19:32

POSIX указывает, что Утилита unlink вызывает функцию unlink библиотеки C и ничего больше. Это не требует выбора. Если вы передадите действительный путь чему-то, что не является каталогом, и если у вас есть права на запись в каталог, где находится этот объект, то unlink удалит его.

rm - это традиционная команда Unix, которая имеет немного других функций и не является надмножеством unlink (см. Ниже).

Во-первых, rm выполняет проверки безопасности. Если вы попытаетесь rm объект, для которого у вас нет разрешений на запись (которые не имеют отношения к вашей способности удалить его: разрешения содержащего каталога есть!) rm , тем не менее, не откажется, если -f указан. rm обычно жалуется, если файл не существует, как и unlink ; однако с -f , rm не жалуется. Это часто используется в файлах Makefile ( 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-файл откажется, если файл недоступен для записи. Но rm -f file не будет жаловаться, если файл отсутствует. unlink file выполняет свою работу.

unlink , вероятно, был введен, потому что rm слишком умен: иногда вам просто нужна чистая семантика Unix unlink : "удалите эту запись в каталоге, если разрешения каталога разрешают ".

24
27.01.2020, 19:32

Теги

Похожие вопросы