Il existe au moins deux programmes appelés realpath
:
- Un ancien programme de l'époque où GNU coreutils n'incluait pas
readlink -f
. Il est désormais obsolète au profit dereadlink -f
, tant de distributions ont cessé de le proposer. - Le
realpath
programme introduit dans GNU coreutils 8.15. C'est trop vieux pour être dans Debian squeeze ou même wheezy; au moment de la rédaction, Debian unstable ne le fournit pas non plus. Ce programme est très proche dereadlink -f
.
Pour une raison quelconque, vous avez une fonction shell qui émule en partie le comportement de realpath
. Cette émulation est partielle :si vous l'appelez sur un lien symbolique, elle ne suit pas le lien symbolique.
Puisqu'il s'agit d'une fonction shell, vraisemblablement chargée depuis ou via .bashrc
, il n'est disponible que pour le code exécuté dans votre shell interactif. Si vous voulez qu'il soit disponible pour d'autres programmes, en supposant que vous utilisez Linux, créez un script qui émule realpath
:
#!/bin/sh
readlink -f -- "[email protected]"
(Cela n'émule pas realpath
les options de ligne de commande rarement utilisées.)
Cela ne fonctionne que dans le shell, car le fichier de script a une portée différente et n'a pas accès à vos fonctions locales et alias définis dans votre rc des dossiers. Et realpath
commande n'existe pas réellement dans votre système.
Donc soit installer realpath
à partir du package, définissez votre propre fonction (dans le cadre du script, vérifiez quelques exemples) ou sourcez le rc fichier dans votre script où il est défini (par exemple . ~/.bashrc
).
Voici les étapes pour installer realpath
s'il n'est pas présent :
- Ubuntu :
sudo apt-get install coreutils
- OS X :
brew install coreutils
Ubuntu et Debian
Sur Debian ou Ubuntu, il semble que le realpath
doit être installé par défaut. J'ai vérifié dans la récente Debian 8 (Jessie) et il semble avoir coreutils
installé par défaut.
Testé avec de nouvelles images de VM :
$ vagrant init debian/jessie64 && vagrant up --provider virtualbox && vagrant ssh
$ vagrant init ubuntu/vivid64 && vagrant up --provider virtualbox && vagrant ssh
Puis dans VM :
$ type -a realpath
realpath is /usr/bin/realpath
Au lieu de realpath
, vous pouvez également utiliser readlink -f file
(ou greadlink
) fourni par coreutils
paquet aussi.
Realpath est-il une commande réelle ou un script ? Je vérifierais d'où ça vient.
$ type -a realpath
Je ne connais pas cet outil, et donc il ne fait probablement pas partie de votre distribution normale, peut-être est-il installé dans un emplacement non standard qui n'est pas présent sur le $PATH
de Bash mais se trouve dans les $PATH
de votre environnement de connexion .
En tout état de cause, les type
ci-dessus command vous montrera d'où vient la commande, à quel point vous pouvez modifier la méthode que vous l'appelez dans votre script comme suit :
echo $(/path/to/realpath test.sh)
Ou modifiez le $PATH
de votre script afin qu'il inclue également cet emplacement non standard.
Fonctions dans le shell
Une grande partie de votre environnement n'est pas appelée lorsque vous appelez un script shell. Si vous réfléchissez à cela, cela a beaucoup de sens, car vous ne voulez généralement pas que les scripts aient tout le bagage supplémentaire que l'environnement d'un utilisateur peut avoir.
Vous pouvez soit déterminer quel fichier source fournit cette fonction et soit le sourcer, soit simplement demander à Bash d'intégrer votre environnement de connexion.
#!/bin/bash -l
echo $(realpath "$1")