Wie erhalte ich den vollständig aufgelösten Pfad einer symbolischen Verknüpfung in Terminal?

47

Ich habe ein Durcheinander von Python-Installationen auf meinem Laptop. Ich habe mir die ausführbaren Dateien in angeschaut /usr/local/binund sie sind alle symbolische Links zu../../../Library......

Es gibt ein seltsames Verhalten, das das umgibt. Wenn ich das tue, ls -lhaGsehe ich --->und den relativen Pfad rechts von den Symlinks:

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

Es scheint jedoch nicht möglich zu sein, eines der Befehlszeilentools zum Auflösen dieses Pfads und Anzeigen des tatsächlichen Pfads zu python3 zu verwenden. Ich habe hier und da ein paar Kleinigkeiten in Bezug auf die Verwendung pwd -Pund das findDienstprogramm gefunden, um dies zu tun. Das Problem ist, dass diese offenbar unter OS X nicht so funktionieren, wie sie unter Linux beschrieben werden (dh den vollständigen Pfad zur symbolischen Verknüpfung ausgeben). Sie drucken nur den Pfad für symbolische Links für mich:

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

Irgendwelche Ideen, was hier los ist?

Robert S. Ciaccio
quelle

Antworten:

36

Ich denke das pwd -Pund readlinkwerde deine Freunde für diese Aufgabe sein.

" Wie kann ich das Verhalten von GNUs readlink -f auf einem Mac ermitteln? " Ist eine nützliche Ressource.

pwd -P Funktioniert nur, wenn Sie sich im symlink-Verzeichnis befinden:

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

readlink Funktioniert durch Angabe des Ziels (kann also für Dateien verwendet werden):

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

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

Die Ausgabe von readlinkscheint relativ zum übergeordneten Element des angegebenen Ziels zu sein.

Bsp .: Das übergeordnete Element von /varist /also private/varkorrekt relativ zu /. Gemäß dem obigen Beispiel von befinden bin -> Applicationssich beide in meinem Basisverzeichnis, unabhängig davon, wo ich sie ausführe, die Ausgabe ist die gleiche.

Jason Salaz
quelle
3
readlink greift nicht durch den Fall, in dem der Symlink auf andere Symlinks verweist. Ich würde das nicht "vollständig gelöst" nennen
James Roth
Dies scheint bei der Frage von OP nach Symlinks zu Dingen, die mit Dingen wie angegeben wurden, nicht zu funktionieren ../...
user124384
18

Dies wird rekursiv aufgelöst und gibt einen absoluten Pfad zurück:

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

Oder die nicht interaktive Version:

python -c "import os; print(os.path.realpath('/usr/local/bin/python3'))"
James Roth
quelle
1
Wenn Builtins versagen, greife auf Scripting zurück ... Nett. Funktioniert definitiv: $ python -c "import os; print os.path.realpath('bin')">> /Users/jason/Applications. Ich verknüpfe ~ / bin mit ~ / Applications, um ein einheitliches .bash_profile / $ PATH auf Mac- und * nix-Systemen zu erhalten.
Jason Salaz
1
Das ist großartig und es funktioniert gut! Ich würde es als die Antwort markieren, außer ich möchte auch wissen, ob es eine Möglichkeit gibt, dies in der Shell zu tun, wie Sie es auf anderen * nix-Systemen können.
Robert S Ciaccio
1
Wie machst du das auf anderen * nix-Systemen? Außerdem ist Python heutzutage auf Linux-Systemen nahezu universell installiert.
Jason Salaz
@vxjasonxv die Sachen, die ich zu der Zeit gefunden habe, als ich damit rumgespielt habe, deuteten darauf hin, dass die Befehle pwdund, findüber die ich in der Frage gesprochen habe, den vollständigen Pfad auf anderen Systemen als OS X auflösen. Ich habe sie jedoch nicht getestet.
Robert S Ciaccio
1

GNU coreutils-8.15 hat 2012 ein neues Befehlszeilen-Tool hinzugefügt, das genau realpathdas tut, was Sie wollen: Es löst Ketten symbolischer Verknüpfungen auf und gibt das Ergebnis entweder als absoluten (Standard) oder relativen Pfad aus.

Apple ist noch nicht realpathin macOS enthalten (sie scheinen leider alle GPLv3-Tools zu meiden), aber Sie können es einfach selbst installieren, z brew install coreutils. B. mit Homebrew:.

Markus Kuhn
quelle
-2

Sie können verwenden readlink -f. Es wiederholt sich durch alle Links. Angenommen, die Verknüpfung ist ein Pfad, der eine Verknüpfung darstellt. Sie möchten den endgültigen absoluten Pfad haben.

DINESH SEHRA
quelle
Huh? Was sagst du genau?
Rob
Die korrekte Syntax für das, was @DINESH SEHRA sagt, ist beispielsweise zu verwenden read link -f python3und puffert den vollständigen symbolischen Link für Sie.
Danijel-James W
3
Offensichtlich nicht von einem OS X-Benutzer gepostet, da -fes in der OS X-Version von readlink noch nie existiert hat.
Sorin