74 votes

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

J'ai un fouillis d'installations Python sur mon ordinateur portable. Je regardais les exécutables dans /usr/local/bin et ils sont tous des liens symboliques vers ../../../Library......

Il y a un comportement bizarre autour de ça. Si je fais ls -lhaG Je vois. ---> et 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 parviens pas à faire en sorte que les outils de ligne de commande résolvent ce chemin et affichent le chemin réel vers python3. J'ai trouvé quelques informations ici et là concernant l'utilisation de l'option pwd -P et le find pour ce faire. Le problème est que ces utilitaires ne semblent pas fonctionner sous OS X de la manière dont les gens les décrivent sous Linux (c'est-à-dire en affichant le chemin complet du lien symbolique). Ils se contentent d'imprimer le chemin du lien symbolique 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 ?

53voto

Christopher Scott Points 665

Je pense que pwd -P y readlink vont être vos amis pour cette tâche.

" Comment puis-je obtenir le comportement de readlink -f de GNU sur un Mac ? "est une ressource très utile.

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

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 (il peut donc être utilisé contre des fichiers) :

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

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

La sortie de readlink semble être relative à la parent de la cible spécifiée.

Ex : Le parent de /var es / donc private/var est correct, par rapport à / . Dans mon exemple ci-dessus bin -> Applications Les deux sont dans mon répertoire personnel, et quel que soit l'endroit où je l'exécute, le résultat est le même.

8 votes

Readlink n'effectue pas de récursion dans le cas où le lien symbolique pointe vers d'autres liens symboliques. Je n'appellerais pas cela "entièrement résolu".

1 votes

Cela ne semble pas fonctionner avec la question de l'OP concernant les liens symboliques vers des choses spécifiées avec des choses comme ../.. .

26voto

alex Points 141

Ceci résout récursivement 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'))"

1 votes

Quand les modules intégrés vous font défaut, utilisez les scripts... Bien. Ca marche vraiment : > $ python -c "import os; print os.path.realpath('bin')" > /Users/jason/Applications . Je fais un lien symbolique entre ~/bin et ~/Applications afin d'avoir un .bash_profile/$PATH unifié sur les systèmes Mac et *nix.

1 votes

C'est génial et ça marche bien ! Je le marquerais bien comme réponse, mais je voudrais aussi savoir s'il y a un moyen de faire ça dans le shell comme sur les autres systèmes *nix.

1 votes

Comment faites-vous sur les autres systèmes *nix ? De plus, Python est installé presque universellement sur les systèmes Linux de nos jours.

4voto

Markus Kuhn Points 121

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

Apple n'inclut pas encore realpath dans MacOS (ils semblent malheureusement fuir tous les outils GPLv3), mais vous pouvez facilement l'installer vous-même, par exemple en utilisant Homebrew : brew install coreutils .

1voto

David Bryson Points 48

Peut-être que cette discussion sur Stack Overflow peut vous aider : Comment résoudre les liens symboliques dans un shell script En particulier, veuillez considérer cette réponse .

-3voto

atebits Points 783

Vous pouvez utiliser readlink -f . Il récure à travers tous les liens. Supposons que le lien est vers un chemin qui est encore un lien. Vous aimeriez avoir le chemin absolu final.

0 votes

Hein ? Qu'est-ce que tu dis exactement ?

0 votes

La syntaxe correcte pour ce que dit @DINESH SEHRA est d'utiliser read link -f python3 par exemple, et il mettra en mémoire tampon le lien symbolique complet pour vous.

3 votes

Clairement pas posté par un utilisateur d'OS X comme -f n'a jamais existé sur la version OS X de readlink.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X