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?
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 inexistantreadlink -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
readlink
est installé dans la plupart des distributions Linux. Alors que realpath
doit souvent être installé explicitement.
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
")