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?

Réponses:


73

Il y a plusieurs realpathcommandes autour.

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).


8
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à readlink en 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; dr readlink -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).

readlink -f

$ readlink -f non-existent-file
/home/user/non-existent-file
$ echo $?
0

readlink -e

$ readlink -e non-existent-file
$ echo $?
1

realpath

$ realpath non-existent-file
non-existent-file: No such file or directory
$ echo $?
1

readlink -f avec répertoire inexistant

readlink -f Le comportement varie en fonction de la partie du chemin qui n'existe pas.

$ readlink -f /tmp/non-existent-dir/foo
$ echo $?
1

La disponibilité

readlinkest installé dans la plupart des distributions Linux. Considérant que, realpathdoit souvent être explicitement installé.

En résumé

Si vous souhaitez remplacer les appels à realpath ...utiliser ensuite readlink -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 de realpathse comporte commereadlink -f ")


3
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.
Pred
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.