Suponiendo que sabe que el objetivo es un enlace simbólico y no un archivo, ¿hay alguna diferencia entre usar rm
y unlink
eliminar el enlace?
Suponiendo que sabe que el objetivo es un enlace simbólico y no un archivo, ¿hay alguna diferencia entre usar rm
y unlink
eliminar el enlace?
Respuestas:
Cada vez que tenga este tipo de preguntas, es mejor concebir una pequeña prueba para ver qué está sucediendo realmente. Para esto puedes usar strace
.
$ touch file1
$ strace -s 2000 -o unlink.log unlink file1
$ touch file1
$ strace -s 2000 -o rm.log rm file1
Cuando observa los 2 archivos de registro resultantes, puede "ver" lo que cada llamada está haciendo realmente.
Con unlink
esto se invoca la unlink()
llamada al sistema:
....
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) = ?
....
Con rm
es un camino ligeramente diferente:
....
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 +++
...
El sistema llama unlink()
y unlinkat()
es esencialmente el mismo, excepto por las diferencias descritas en esta página de manual: http://linux.die.net/man/2/unlinkat .
La llamada al sistema unlinkat () funciona exactamente de la misma manera que unlink (2) o rmdir (2) (dependiendo de si las banderas incluyen o no la bandera AT_REMOVEDIR) excepto por las diferencias descritas en esta página del manual.
Si el nombre de ruta proporcionado en pathname es relativo, entonces se interpreta en relación con el directorio al que hace referencia el descriptor de archivo dirfd (en lugar de en relación con el directorio de trabajo actual del proceso de llamada, como lo hacen unlink (2) y rmdir (2 ) para un nombre de ruta relativo).
Si el nombre de ruta proporcionado en pathname es relativo y dirfd es el valor especial AT_FDCWD, entonces pathname se interpreta en relación con el directorio de trabajo actual del proceso de llamada (como unlink (2) y rmdir (2)).
Si el nombre de ruta dado en pathname es absoluto, entonces dirfd se ignora.
AT_FDCWD
, efectivamente no hay diferencia entre unlink
y unlinkat
.
POSIX especifica que la unlink
utilidad llama a la unlink
función de biblioteca C y nada más. No tiene opción. Si pasa un nombre de ruta válido a algo que no es un directorio, y si tiene permisos de escritura en el directorio donde vive ese objeto, unlink
lo eliminará.
rm
es un comando tradicional de Unix que tiene un poco de otra funcionalidad y no es un superconjunto unlink
(ver más abajo).
En primer lugar, rm
realiza controles de seguridad. Si intenta rm
un objeto para el que no tiene permisos de escritura (que son irrelevantes para su capacidad de eliminarlo: ¡los permisos directos sí lo son!), Sin rm
embargo, se niega a menos que -f
se especifique. rm
normalmente se queja si el archivo no existe, como lo hace unlink
; sin embargo con -f
, rm
no se queja. Esto a menudo se explota en Makefiles ( clean: @rm -f $(OBJS) ...
), por lo make clean
que no falla cuando no hay nada que eliminar.
En segundo lugar, rm
tiene la -i
opción de confirmar interactivamente la eliminación.
En tercer lugar, rm
tiene -r
para eliminar recursivamente un directorio, que es algo que unlink
no es necesario hacer, ya que la función de biblioteca C no hace eso.
La unlink
utilidad no es exactamente una simplificada rm
. Realiza un subconjunto de lo que rm
hace, pero tiene una semántica que es una combinación de rm
con -f
y rm sin -f
.
Suponga que desea eliminar un archivo normal independientemente de cuáles sean sus propios permisos. Además, suponga que desea que el comando falle si el archivo no existe o por cualquier otro motivo. Ni rm file
tampoco rm -f file
cumple con los requisitos. rm file
se negará si el archivo no se puede escribir. Pero rm -f file
dejará de quejarse si falta el archivo. unlink file
hace el trabajo.
unlink
probablemente se introdujo porque rm
es demasiado inteligente: a veces solo desea la unlink
semántica pura de Unix : "haga que esta entrada del directorio desaparezca si los permisos del directorio lo permiten" .
unlink
lugar de solo describir las diferencias.
Con un solo archivo, rm y unlink realizan la misma tarea, elimine el archivo. Como POSIX definió, rm
y unlink
ambos llaman a unlink () llamada al sistema.
En GNU rm
, llama a la llamada al sistema unlinkat () , que es equivalente a la función unlink()
o rmdir () , excepto en el caso en que la ruta especifica una ruta relativa.
Nota
En algunos sistemas, unlink
también puede eliminar el directorio. Al menos en el sistema GNU, unlink
nunca se puede eliminar el nombre de un directorio.