Comment obtenir le chemin entièrement résolu d'un lien symbolique dans Terminal?

47

J'ai un désordre enchevêtré d'installations python sur mon ordinateur portable. Je regardais les exécutables /usr/local/binet ils sont tous des liens symboliques vers../../../Library......

Il y a un comportement étrange autour de cela. Si je le vois, ls -lhaGje vois --->le chemin relatif à droite des liens symboliques:

lrwxr-xr-x  1 root  wheel    69B Dec  7 22:29 python3 -> ../../../Library/Frameworks/Python.framework/Versions/3.1/bin/python3

Cependant, je ne peux pas sembler avoir aucun des outils en ligne de commande pour résoudre ce chemin et afficher le chemin réel vers python3. J'ai trouvé quelques détails ici et là concernant l'utilisation de pwd -Pet l' findutilitaire pour le faire. Le problème est que cela ne semble pas fonctionner sous OS X de la façon dont les gens le décrivent comme fonctionnant sous Linux (c'est-à-dire qu'il affiche le chemin d'accès complet au lien symbolique). Ils viennent d’imprimer le chemin des liens symboliques pour moi:

FantasticMrFox:bin robert$ pwd -P python3
/usr/local/bin
FantasticMrFox:bin robert$ find `pwd -P` -name python3
/usr/local/bin/python3

Des idées sur ce qui se passe ici?

Robert S Ciaccio
la source

Réponses:

36

Je pense que pwd -Pet readlinkvont être vos amis pour cette tâche.

" Comment puis-je obtenir le comportement de readlink -f de GNU sur un Mac? " Est une ressource pratique.

pwd -P ne fonctionne que si vous êtes dans le répertoire symlink:

14:07:13 jason@mac ~ $ cd bin
14:08:08 jason@mac bin $ pwd -P
/Users/jason/Applications

readlink fonctionne en spécifiant la cible (elle peut donc être utilisée contre des fichiers):

14:09:03 jason@mac ~ $ readlink bin
Applications

14:09:34 jason@mac ~ $ readlink /var
private/var

La sortie de readlinksemble être relative au parent de la cible spécifiée.

Ex: Le parent de /varis /, private/varest donc correct, par rapport à /. D'après mon exemple ci-dessus bin -> Applications, les deux sont dans mon répertoire personnel, peu importe où je l'exécute, la sortie est la même.

Jason Salaz
la source
3
readlink ne rentre pas dans le cas où le lien symbolique pointe vers d'autres liens symboliques. Je ne qualifierais pas cela de "résolution complète"
James Roth
Cela ne semble pas fonctionner avec la question de OP sur les liens symboliques vers des éléments spécifiés avec des éléments tels que ../...
user124384
18

Cela résout de manière récursive et renvoie un chemin absolu:

$ python
>>> import os
>>> os.path.realpath("/usr/local/bin/python3")

Ou la version non interactive:

python -c "import os; print(os.path.realpath('/usr/local/bin/python3'))"
James Roth
la source
1
Lorsque les éléments intégrés vous échouent, utilisez des scripts ... Sympa. Fonctionne vraiment: $ python -c "import os; print os.path.realpath('bin')">> /Users/jason/Applications. Je symlink ~ ~ bin vers ~ / Applications afin d’avoir un .bash_profile / $ PATH unifié sur les systèmes Mac et * nix.
Jason Salaz
1
c'est génial et ça marche bien! Je marquerais cela comme la réponse, sauf que je voudrais aussi savoir s'il existe un moyen de faire cela dans le shell, comme vous pouvez le faire sur d'autres systèmes * nix.
Robert S Ciaccio
1
Comment faites-vous sur d'autres systèmes * nix? De plus, Python est installé presque universellement sur les systèmes Linux de nos jours.
Jason Salaz
@vxjasonxv, ce que j'ai trouvé à l'époque, suggéraient que les commandes pwdet dont findj'ai parlé dans la question résolvent le chemin d'accès complet sur des systèmes autres que OS X. Je ne les ai cependant pas testées.
Robert S Ciaccio
1

GNU coreutils-8.15 a ajouté en 2012 un nouvel outil de ligne de commande realpathqui fait ce que vous voulez: il résout les chaînes de liens symboliques et affiche le résultat sous forme de chemin absolu (par défaut) ou relatif.

Apple ne comprend pas encore realpathdans macOS (ils semblent malheureusement à éviter tous les outils GPLv3), mais vous pouvez facilement installer vous - même, par exemple en utilisant Homebrew: brew install coreutils.

Markus Kuhn
la source
-2

Vous pouvez utiliser readlink -f. Il revient à travers tous les liens. Supposons que le lien est vers un chemin qui est en outre un lien. Vous voudriez avoir le chemin absolu final.

DINESH SEHRA
la source
Hein? Que dites-vous exactement?
Rob
La syntaxe correcte pour ce que @DINESH SEHRA dit est d'utiliser, read link -f python3par exemple, et elle mettra en mémoire tampon le lien symbolique complet pour vous.
Danijel-James W
3
Clairement, pas posté par un utilisateur OS X comme -fjamais existé sur la version OS X de readlink.
sorin