En supposant que vous savez que la cible est un lien symbolique et non un fichier, y a-t-il une différence entre l'utilisation de rm
et unlink
pour supprimer le lien?
POSIX spécifie que l'utilitaire unlink
appelle la fonction de bibliothèque C unlink
et rien d'autre. Cela ne prend aucune option. Si vous passez un nom de chemin d'accès valide à quelque chose qui n'est pas un répertoire, et si vous avez des autorisations d'écriture dans le répertoire où se trouve cet objet, unlink
le supprimera.
rm
est une commande Unix traditionnelle qui a un peu d'autres fonctionnalités et n'est pas tout à fait un surensemble de unlink
(voir ci-dessous).
Premièrement, rm
effectue des contrôles de sécurité. Si vous essayez de rm
un objet sur lequel vous n'avez pas d'autorisations d'écriture (qui ne sont pas pertinentes pour votre capacité à le supprimer: les autorisations du répertoire contenant sont!) rm
refuse néanmoins sauf si -f
Est spécifié. rm
se plaint normalement si le fichier n'existe pas, tout comme unlink
; cependant avec -f
, rm
ne se plaint pas. Ceci est souvent exploité dans Makefiles (clean: @rm -f $(OBJS) ...
) donc make clean
N'échoue pas quand il n'y a rien à supprimer.
Deuxièmement, rm
a l'option -i
Pour confirmer interactivement la suppression.
Troisièmement, rm
a -r
Pour supprimer récursivement un répertoire, ce que unlink
n'est pas obligé de faire, car la fonction de bibliothèque C ne le fait pas.
L'utilitaire unlink
n'est pas exactement un rm
. Il effectue un sous-ensemble de ce que fait rm
, mais il a une sémantique qui est une combinaison de rm
avec-f
et rm sans-f
.
Supposons que vous souhaitiez simplement supprimer un fichier normal quelles que soient ses propres autorisations. De plus, supposons que vous vouliez que la commande échoue si le fichier n'existe pas, ou pour toute autre raison. Ni rm file
Ni rm -f file
Répond aux exigences. rm file
Refusera si le fichier n'est pas accessible en écriture. Mais rm -f file
Négligera de se plaindre si le fichier est manquant. unlink file
Fait le travail.
unlink
a probablement été introduit parce que rm
est trop intelligent: parfois vous voulez juste la sémantique Unix unlink
pure: "veuillez faire cette entrée de répertoire disparaître si les autorisations du répertoire le permettent ".
Avec un seul fichier, rm et nlink faites la même tâche, supprimez le fichier. Comme POSIX l'a défini, rm
et unlink
appellent tous les deux nlink () appel système.
Dans GNU rm
, il appelle nlinkat () appel système, ce qui équivaut à unlink()
ou rmdir () fonction sauf dans le cas où path spécifie un chemin relatif.
Remarque
Sur certains systèmes, unlink
peut également supprimer le répertoire. Au moins dans le système GNU, unlink
ne peut jamais supprimer le nom d'un répertoire.