En supposant que vous sachiez que la cible est un lien symbolique et non un fichier, existe-t-il une différence entre utiliser rmet unlinksupprimer le lien?
@ slm ♦ Les réponses correspondent à cette question, mais cette question est différente: "En supposant que vous sachiez que la cible est un lien symbolique et non un fichier".
Stéphane Gourichon
Ne semble pas que vous ayez accepté une réponse ici @IQAndreas. S'il vous plaît, faites-le s'ils vous ont aidé.
Gray
Réponses:
56
Chaque fois que vous avez ce type de questions, il est préférable de concevoir un petit test pour voir ce qui se passe réellement. Pour cela, vous pouvez utiliser strace.
Les appels système unlink()et unlinkat()sont essentiellement les mêmes, à l'exception des différences décrites dans cette page de manuel: http://linux.die.net/man/2/unlinkat .
extrait
L'appel système unlinkat () fonctionne exactement de la même manière que unlink (2) ou rmdir (2) (selon que les options incluent ou non l'indicateur AT_REMOVEDIR), à l'exception des différences décrites dans cette page de manuel.
Si le nom de chemin indiqué dans chemin est relatif, il est interprété par rapport au répertoire référencé par le descripteur de fichier dirfd (plutôt que par rapport au répertoire de travail actuel du processus appelant, comme le font par unlink (2) et rmdir (2). ) pour un chemin relatif).
Si le nom de chemin indiqué dans chemin est nom relatif et que dirfd est la valeur spéciale AT_FDCWD, le chemin est interprété par rapport au répertoire de travail actuel du processus appelant (comme unlink (2) et rmdir (2)).
Si le chemin indiqué dans chemin est absolu, alors dirfd est ignoré.
Étant donné que c'est donner AT_FDCWD, il n'y a effectivement aucune différence entre unlinket unlinkat.
Barmar
6
Cela me fait plaisir de lire cette réponse parce que je viens "d'apprendre à pêcher" de manière puissante et flexible lorsque je prends souvent un poisson ou parfois "d'apprendre à pêcher" de manière basique sur SO :-)
sage
22
POSIX spécifie que l' unlinkutilitaire appelle la unlinkfonction de bibliothèque C et rien d'autre. Cela ne prend aucune option. Si vous transmettez un nom de chemin valide à quelque chose qui n'est pas un répertoire et si vous disposez d'autorisations en écriture sur le répertoire où cet objet réside, vous unlinkle supprimerez.
rmest une commande Unix traditionnelle qui a un peu d'autres fonctionnalités et qui n'est pas vraiment un sur-ensemble unlink(voir ci-dessous).
Tout d'abord, rmeffectue des contrôles de sécurité. Si vous essayez rmun objet pour lequel vous ne possédez pas d’autorisation en écriture (qui n’a aucune incidence sur votre capacité à le supprimer: les autorisations directes le sont!) rmRefuse néanmoins sauf si -fest spécifié. rmse plaint normalement si le fichier n'existe pas, comme c'est le cas unlink; cependant avec -f, rmne se plaint pas. Ceci est souvent exploité dans Makefiles ( clean: @rm -f $(OBJS) ...), donc make cleann'échoue pas lorsqu'il n'y a rien à supprimer.
Deuxièmement, rma la -ipossibilité de confirmer de manière interactive la suppression.
Troisièmement, il rmfaut -rsupprimer récursivement un répertoire, ce qui unlinkn’est pas obligatoire, car la fonction de bibliothèque C ne le fait pas.
L' unlinkutilitaire n'est pas vraiment un dépouillé rm. Il exécute un sous-ensemble de ce qui rmfonctionne, mais il a une sémantique qui est une combinaison de rmwith-f et rm without-f .
Supposons que vous souhaitiez simplement supprimer un fichier normal, quelles que soient ses propres autorisations. De plus, supposez que vous souhaitiez que la commande échoue si le fichier n'existe pas ou pour toute autre raison. Ni rm fileni rm -f filerépond aux exigences. rm filerefusera si le fichier n'est pas accessible en écriture. Mais rm -f filenéglige de se plaindre si le fichier est manquant. unlink fileFait le travail.
unlinka probablement été introduit parce qu’il rmest trop intelligent: parfois, vous voulez juste la unlinksémantique Unix pure : "veuillez faire en sorte que cette entrée de répertoire disparaisse si les autorisations de répertoire le permettent" .
C'est la réponse la plus claire ici. Il donne en fait le cas d'utilisation pour unlinkplutôt que de simplement décrire les différences.
Wildcard
19
Avec un seul fichier, rm et unlink effectuent la même tâche, supprimez le fichier. Comme défini POSIX, rmet à la unlinkfois appel à unlink () appel système.
Dans GNU rm, il appelle l’ appel système unlinkat () , ce qui équivaut à la fonction unlink()ou à la fonction rmdir () , sauf dans le cas où chemin spécifie un chemin relatif.
Remarque
Sur certains systèmes, unlinkpeut également supprimer un répertoire. Au moins dans le système GNU, unlinkne peut jamais supprimer le nom d’un répertoire.
Réponses:
Chaque fois que vous avez ce type de questions, il est préférable de concevoir un petit test pour voir ce qui se passe réellement. Pour cela, vous pouvez utiliser
strace
.dissocier
rm
Lorsque vous examinez les 2 fichiers journaux résultants, vous pouvez "voir" ce que fait réellement chaque appel.
Panne
Avec
unlink
l'appel de l'unlink()
appel système:Avec
rm
c'est un chemin légèrement différent:Les appels système
extraitunlink()
etunlinkat()
sont essentiellement les mêmes, à l'exception des différences décrites dans cette page de manuel: http://linux.die.net/man/2/unlinkat .la source
AT_FDCWD
, il n'y a effectivement aucune différence entreunlink
etunlinkat
.POSIX spécifie que l'
unlink
utilitaire appelle launlink
fonction de bibliothèque C et rien d'autre. Cela ne prend aucune option. Si vous transmettez un nom de chemin valide à quelque chose qui n'est pas un répertoire et si vous disposez d'autorisations en écriture sur le répertoire où cet objet réside, vousunlink
le supprimerez.rm
est une commande Unix traditionnelle qui a un peu d'autres fonctionnalités et qui n'est pas vraiment un sur-ensembleunlink
(voir ci-dessous).Tout d'abord,
rm
effectue des contrôles de sécurité. Si vous essayezrm
un objet pour lequel vous ne possédez pas d’autorisation en écriture (qui n’a aucune incidence sur votre capacité à le supprimer: les autorisations directes le sont!)rm
Refuse néanmoins sauf si-f
est spécifié.rm
se plaint normalement si le fichier n'existe pas, comme c'est le casunlink
; cependant avec-f
,rm
ne se plaint pas. Ceci est souvent exploité dans Makefiles (clean: @rm -f $(OBJS) ...
), doncmake clean
n'échoue pas lorsqu'il n'y a rien à supprimer.Deuxièmement,
rm
a la-i
possibilité de confirmer de manière interactive la suppression.Troisièmement, il
rm
faut-r
supprimer récursivement un répertoire, ce quiunlink
n’est pas obligatoire, car la fonction de bibliothèque C ne le fait pas.L'
unlink
utilitaire n'est pas vraiment un dépouillérm
. Il exécute un sous-ensemble de ce quirm
fonctionne, mais il a une sémantique qui est une combinaison derm
with-f
et rm without-f
.Supposons que vous souhaitiez simplement supprimer un fichier normal, quelles que soient ses propres autorisations. De plus, supposez que vous souhaitiez que la commande échoue si le fichier n'existe pas ou pour toute autre raison. Ni
rm file
nirm -f file
répond aux exigences.rm file
refusera si le fichier n'est pas accessible en écriture. Maisrm -f file
néglige de se plaindre si le fichier est manquant.unlink file
Fait le travail.unlink
a probablement été introduit parce qu’ilrm
est trop intelligent: parfois, vous voulez juste launlink
sémantique Unix pure : "veuillez faire en sorte que cette entrée de répertoire disparaisse si les autorisations de répertoire le permettent" .la source
unlink
plutôt que de simplement décrire les différences.Avec un seul fichier, rm et unlink effectuent la même tâche, supprimez le fichier. Comme défini POSIX,
rm
et à launlink
fois appel à unlink () appel système.Dans GNU
rm
, il appelle l’ appel système unlinkat () , ce qui équivaut à la fonctionunlink()
ou à la fonction rmdir () , sauf dans le cas où chemin spécifie un chemin relatif.Remarque
Sur certains systèmes,
unlink
peut également supprimer un répertoire. Au moins dans le système GNU,unlink
ne peut jamais supprimer le nom d’un répertoire.la source