web-dev-qa-db-fra.com

Quelle est la différence entre "realpath" et "readlink -f"

J'ai lu beaucoup de choses sur la commande realpath et comment elle a été déconseillée avec la commande readlink -f étant maintenant recommandé. J'ai également vu à certains endroits que la raison pour laquelle realpath a été introduit était le manque d'une telle fonctionnalité dans readlink et qu'une fois qu'il a été introduit, realpath n'était plus nécessaire et son support a été interrompu par la plupart des fournisseurs de systèmes d'exploitation.

La raison de ma question est que j'ai également vu de nombreuses personnes recommander readlink -f comme une commande "à peu près similaire" à realpath, et c'est ce qui me dérange, car personne n'élabore sur cette partie "à peu près similaire". Quelles sont les différences réelles?

77
Felipe Leão

Il existe plusieurs commandes realpath.

L'utilitaire realpath est un wrapper autour des fonctions de la bibliothèque realpath et a été réinventé plusieurs fois .

Debian avait l'habitude de maintenir un paquet realpath ( séparé de dwww depuis woody =) qui n'a pas changé sauf en ce qui concerne l'emballage et la documentation depuis 2001, mais qui a maintenant été supprimé. Cet utilitaire est obsolète car il existe désormais plus d'alternatives standard (GNU readlink et bientôt GNU realpath), mais à l'époque, GNU n'avaient même pas du tout readlink. Cette implémentation de realpath prend en charge quelques options pour empêcher la résolution de liens symboliques ou produire une sortie terminée par null. BusyBox inclut également sa propre commande realpath (qui ne prend aucune option).

GNU coreutils a introduit une commande realpath dans version 8.15 en janvier 2012. Il s'agit d'un remplacement compatible pour BusyBox et Debian's realpath, et a également de nombreuses options en commun avec GNU readlink .

realpath a le même effet que readlink -f avec GNU readlink. Ce qui distingue les deux commandes (ou plutôt les diverses commandes realpath de readlink -f) sont les options supplémentaires qu'ils prennent en charge.

GNU realpath n'est pas obsolète; il a le problème inverse: c'est trop nouveau pour être disponible partout. Debian avait l'habitude de omettre GNU realpath de son coreutils paquet et s'en tenir à son propre realpath. Je ne sais pas pourquoi, puisque GNU realpath devrait être un remplacement direct. Comme pour Debian jessie et Ubuntu 16.04, cependant, GNU realpath est utilisé.

Sur les systèmes Linux, pour le moment, votre meilleur pari pour canoniser un chemin qui peut contenir des liens symboliques est readlink -f.

Les systèmes BSD ont une commande readlink , avec des capacités différentes de GNU readlink. En particulier, BSD readlink n'a pas d'option pour canoniser les chemins, il ne traverse que le lien symbolique qui lui est passé.

readlink, d'ailleurs, avait le même problème - c'était aussi inventé plusieurs fois (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).

tl; drreadlink -f renverra 0 pour un fichier inexistant dans un répertoire existant alors que realpath renvoie 1. Cependant, readlink -e se comportera comme realpath et renverra 1 pour un fichier inexistant (voir la note de l'éditeur à la fin).

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 un 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

realpath avec un répertoire inexistant

$ realpath /tmp/non-existent-dir/foo
$ echo $?
1

Disponibilité

readlink est installé dans la plupart des distributions Linux. Alors que realpath doit souvent être installé explicitement.

En résumé

Si vous souhaitez remplacer les appels à realpath ... puis utilisez 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 GNU version de realpath se comporte comme readlink -f ")

21