Jak uzyskać w pełni rozwiązaną ścieżkę dowiązania symbolicznego w terminalu?

47

Mam zaplątany bałagan instalacji Pythona na moim laptopie. Patrzyłem na pliki wykonywalne /usr/local/bini wszystkie są symbolicznymi linkami do../../../Library......

Jest w tym trochę dziwnych zachowań. Jeśli ls -lhaGwidzę, --->i względną ścieżkę po prawej stronie dowiązań symbolicznych:

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

Jednak nie mogę uzyskać żadnego z narzędzi wiersza polecenia, aby rozwiązać tę ścieżkę i wyświetlić rzeczywistą ścieżkę do python3. Tu i ówdzie znalazłem kilka ciekawostek dotyczących wykorzystania pwd -Pi findnarzędzia do tego celu. Problem polega na tym, że wydaje się, że nie działają one w systemie OS X w sposób, w jaki ludzie je opisują, pracując na systemie Linux (tj. Wyświetlając pełną ścieżkę do dowiązania symbolicznego). Po prostu drukują mi ścieżkę dowiązań symbolicznych:

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

Jakieś pomysły na to, co się tutaj dzieje?

Robert S. Ciaccio
źródło

Odpowiedzi:

36

Myślę, że pwd -Pi readlinkbędą twoimi przyjaciółmi do tego zadania.

Jak mogę uzyskać zachowanie readlink -f GNU na komputerze Mac? ” Jest przydatnym zasobem.

pwd -P działa tylko, jeśli znajdujesz się w katalogu dowiązań symbolicznych:

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

readlink działa poprzez określenie celu (dzięki czemu można go użyć przeciwko plikom):

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

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

Dane wyjściowe readlinkwydają się być względne względem elementu nadrzędnego określonego celu.

Np .: Element nadrzędny /varjest /, więc private/varjest poprawny, względem /. W powyższym przykładzie bin -> Applicationsoba są w moim katalogu domowym, bez względu na to, gdzie je uruchamiam, wyniki są takie same.

Jason Salaz
źródło
3
readlink nie powtarza się w przypadku, gdy dowiązanie symboliczne wskazuje inne dowiązania symboliczne. Nie nazwałbym tego „w pełni rozwiązanym”
James Roth,
Nie wydaje się, aby działało to z pytaniem OP dotyczącym dowiązań symbolicznych do rzeczy określonych za pomocą rzeczy takich jak ../...
user124384,
18

To rozwiązuje się rekurencyjnie i zwraca ścieżkę bezwzględną:

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

Lub wersja nieinteraktywna:

python -c "import os; print(os.path.realpath('/usr/local/bin/python3'))"
James Roth
źródło
1
Kiedy wbudowane zawiodą, skorzystaj ze skryptów ... Fajnie. Zdecydowanie działa: $ python -c "import os; print os.path.realpath('bin')">> /Users/jason/Applications. Dowiązuję symbolicznie ~ / bin do ~ / Applications, aby mieć zunifikowany plik .bash_profile / $ PATH w systemach Mac i * nix.
Jason Salaz,
1
to jest świetne i działa dobrze! Oznaczę to jako odpowiedź, z wyjątkiem tego, że chcę również wiedzieć, czy można to zrobić w powłoce, tak jak w innych systemach * nix.
Robert S Ciaccio,
1
Jak to zrobić w innych systemach * nix? Ponadto Python jest obecnie instalowany prawie uniwersalnie w systemach Linux.
Jason Salaz,
@vxjasonxv rzeczy, które znalazłem w czasie, gdy miałem z tym problem, sugerowały, że polecenia pwdi find, o których mówiłem w pytaniu, rozwiązują pełną ścieżkę w systemach innych niż OS X. Jednak ich nie przetestowałem.
Robert S Ciaccio
1

GNU coreutils-8.15 dodał w 2012 r. Nowe narzędzie wiersza polecenia, realpathktóre robi to, co chcesz: rozwiązuje łańcuchy dowiązań symbolicznych i wyświetla wynik jako ścieżkę bezwzględną (domyślną) lub względną.

Apple nie uwzględniają jeszcze realpathw MacOS (niestety oni zdają się unikać wszystkich narzędzi GPLv3), ale można łatwo zainstalować go samodzielnie, na przykład za pomocą Homebrew: brew install coreutils.

Markus Kuhn
źródło
-2

Możesz użyć readlink -f. Powtarza się przez wszystkie linki. Załóżmy, że link prowadzi do ścieżki, która jest dalszym linkiem. Chciałbyś mieć ostatnią ścieżkę absolutną.

DINESH SEHRA
źródło
Co? Co dokładnie mówisz
Rob
Poprawną składnią tego, co mówi @DINESH SEHRA, jest read link -f python3na przykład użycie i buforowanie pełnego linku symbolicznego.
Danijel-James W
3
Wyraźnie -fniepublikowany przez użytkownika OS X, ponieważ nigdy nie istniał w wersji readlink w OS OS.
sorin