web-dev-qa-db-fra.com

Quelle est la différence entre 'rm' et 'unlink'?

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?

62
IQAndreas

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 rmavec-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 ".

26
Kaz

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.

20
cuonglm