Quelle est la différence entre «realpath» et «readlink -f»
68
J'ai beaucoup lu sur la realpathcommande et sur la façon dont elle est déconseillée, readlink -fétant maintenant recommandée. J'ai également vu à certains endroits que la raison de l'introduction de realpath était l'absence de cette fonctionnalité dans readlink et que, une fois introduit, realpath n'était plus nécessaire et que la plupart des fournisseurs de systèmes d'exploitation ne prenaient plus en charge ce support.
La raison de ma question est que j'ai aussi vu beaucoup de gens recommander readlink -fune commande "à peu près similaire" realpath, et c'est ce qui me dérange, car personne ne développe sur cette partie "assez similaire". Quelles sont les différences réelles?
L' realpathutilitaire encapsule les realpathfonctions de la bibliothèque et a été réinventé à plusieurs reprises .
Debian utilisé pour maintenir un realpathpaquet ( séparé de dwwwdepuis Woody ) qui n'a pas changé , sauf en ce qui concerne l' emballage et la documentation depuis 2001, mais a été éliminée. Cet utilitaire était obsolète car il y avait maintenant plus d'alternatives standard (GNU readlinket bientôt GNU realpath), mais à l'époque, les utilitaires GNU n'en avaient même pas readlink. Cette implémentation de realpathprend en charge quelques-uns optionspour empêcher la résolution de lien symbolique ou pour produire une sortie terminée par un zéro.
BusyBox inclut également sa propre realpathcommande (qui ne prend aucune option).
GNU coreutils a introduit une realpathcommande dans la version 8.15 en janvier 2012. Il s'agit d'un remplacement compatible pour BusyBox et Debian realpath. Il comporte également de nombreuses options communes avec GNU readlink.
realpatha le même effet readlink -fqu'avec GNU readlink. Ce qui distingue les deux commandes (ou plutôt les différentes realpathcommandes readlink -f), ce sont les options supplémentaires qu’elles supportent.
GNU realpathn'est pas obsolète; le problème est inverse: il est trop nouveau pour être disponible partout. Debian omettait GNUrealpath de son coreutilspaquet et s'en tenait au sien realpath. Je ne sais pas pourquoi, puisque GNU realpathdevrait être un remplaçant instantané. Depuis Debian Jessie et Ubuntu 16.04, GNU realpathest utilisé.
Sur les systèmes Linux, pour le moment, votre meilleur choix pour canoniser un chemin pouvant contenir des liens symboliques est readlink -f.
Les systèmes BSD ont une readlinkcommande, avec des capacités différentes de GNU readlink. En particulier, BSD readlinkn'a pas l'option de canoniser les chemins, il ne fait que traverser le lien symbolique qui lui est transmis.
readlinksoit dit en passant, le même problème - il a également été inventé à plusieurs reprises (ne pas ajouter cet utilitaire lorsque des liens symboliques ont été ajoutés à Unix était une omission regrettable) Il s'est maintenant stabilisé dans plusieurs implémentations avec de nombreux drapeaux incompatibles (en particulier BSD vs. GNU).
readlink -fétait dans OpenBSD bien avant GNU. NetBSD, FreeBSD et OpenBSD ont maintenant tous readlink -f(votre lien le mentionne même). realpathest dans FreeBSD et IRIX depuis longtemps (je ne sais pas si c'est antérieur à celui de Debian). HPUX et IRIX ont également readlink, mais pas -f. Le realpathpaquet dans Debian expérimental est maintenant celui de coreutils (à titre d’expérience pour voir s’il casse des choses). Le dwww realpathagit plutôt comme readlink -ele GNU, readlink -falors ce n'est pas un remplacement complet
Stéphane Chazelas
2
realpatha été sous FreeBSD depuis 2002. Avant cela, pwdle faisait (depuis 2000, pwd some-fileappellerait realpath()le file). Debian en a un realpathpaquet depuis 1996. Celui sur IRIX est probablement antérieur à celui-ci, bien que je n’aie trouvé d’élément de preuve autre qu’il soit dans IRIX 6.5 en 1998. OpenBSD a ajouté un paquet -fà readlinken 1997 . GNU a été ajouté readlinken 2003 et cela -fdepuis le début.
Stéphane Chazelas
2
Excellent résumé merci. Notez que bugs.debian.org/730779 est encore meilleur pour la requête de debian de passer à la variante GNU . Même le mainteneur de realpath existant veut que le changement se produise
Pádraig Brady
1
Réponse géniale. Manqué seulement des références à la mise en œuvre RHEL de realpath. Est-ce que quelqu'un sait s'il est en quelque sorte différent de la readlink -fversion?
Felipe Leão
1
@ StéphaneChazelas Oh wow, beaucoup d'erreurs dans mes réponses. Merci de les signaler. Pourriez-vous poster une réponse correcte, et je vais supprimer la mienne? (Sinon, je corrigerai les erreurs, mais il faudra plus de travail sur ma longue liste de tâches…)
Gilles, arrête de faire le mal '11
17
tl; drreadlink -f retournera 0pour un fichier non existant dans un répertoire existant alors qu'il realpathretourne 1. Cependant, readlink -ese comportera comme realpathet retournera 1pour un fichier inexistant (voir la note à la fin de l’éditeur).
J'ai voté pour cette réponse, mais je suggérerais de préciser que cela fait référence à la version Debian de realpath. La version GNU de realpathse comporte de la même manière que readlink -f.
Anthony G - justice pour Monica
2
Peut confirmer que cela ne fonctionne pas sur MacOS High Sierra.
readlink -f
était dans OpenBSD bien avant GNU. NetBSD, FreeBSD et OpenBSD ont maintenant tousreadlink -f
(votre lien le mentionne même).realpath
est dans FreeBSD et IRIX depuis longtemps (je ne sais pas si c'est antérieur à celui de Debian). HPUX et IRIX ont égalementreadlink
, mais pas-f
. Lerealpath
paquet dans Debian expérimental est maintenant celui de coreutils (à titre d’expérience pour voir s’il casse des choses). Le dwwwrealpath
agit plutôt commereadlink -e
le GNU,readlink -f
alors ce n'est pas un remplacement completrealpath
a été sous FreeBSD depuis 2002. Avant cela,pwd
le faisait (depuis 2000,pwd some-file
appelleraitrealpath()
lefile
). Debian en a unrealpath
paquet depuis 1996. Celui sur IRIX est probablement antérieur à celui-ci, bien que je n’aie trouvé d’élément de preuve autre qu’il soit dans IRIX 6.5 en 1998. OpenBSD a ajouté un paquet-f
àreadlink
en 1997 . GNU a été ajoutéreadlink
en 2003 et cela-f
depuis le début.realpath
. Est-ce que quelqu'un sait s'il est en quelque sorte différent de lareadlink -f
version?tl; dr
readlink -f
retournera0
pour un fichier non existant dans un répertoire existant alors qu'ilrealpath
retourne1
. Cependant,readlink -e
se comportera commerealpath
et retournera1
pour un fichier inexistant (voir la note à la fin de l’éditeur).readlink -f
readlink -e
realpath
readlink -f
avec répertoire inexistantreadlink -f
Le comportement varie en fonction de la partie du chemin qui n'existe pas.La disponibilité
readlink
est installé dans la plupart des distributions Linux. Considérant que,realpath
doit souvent être explicitement installé.En résumé
Si vous souhaitez remplacer les appels à
realpath ...
utiliser ensuitereadlink -e ...
.Testé avec readlink (GNU coreutils) 8.21 et realpath version 1.19 sur Ubuntu 16.
( Ed .: @AnthonyGeoghegan a écrit " cela fait référence à la version Debian de
realpath
. La version GNU derealpath
se comporte commereadlink -f
")la source
realpath
. La version GNU derealpath
se comporte de la même manière quereadlink -f
.