Come ottenere il percorso completamente risolto di un collegamento simbolico in Terminale?


47

Ho un groviglio di installazioni Python sul mio laptop. Stavo guardando gli eseguibili /usr/local/bine sono tutti collegamenti simbolici a../../../Library......

C'è qualche strano comportamento che lo circonda. Se lo faccio ls -lhaGvedo --->e il relativo percorso a destra dei symlink:

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

Tuttavia, non riesco a ottenere nessuno degli strumenti da riga di comando per risolvere quel percorso e visualizzare il percorso effettivo di python3. Ho trovato alcuni bocconcini qua e là sull'uso pwd -Pe findsull'utilità per farlo. Il problema è che questi non sembrano funzionare su OS X nel modo in cui le persone li descrivono lavorando su Linux (es. Espellendo l'intero percorso al collegamento simbolico). Stampano semplicemente il percorso dei collegamenti simbolici per me:

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

Qualche idea su cosa sta succedendo qui?

Risposte:


36

Lo penso pwd -Pe readlinkdiventeremo tuoi amici per questo compito.

" Come posso ottenere il comportamento del readlink di GNU -f su un Mac? " È una risorsa utile.

pwd -P funziona solo se ti trovi all'interno della directory symlink:

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

readlink funziona specificando la destinazione (quindi può essere utilizzata contro i file):

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

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

L'output di readlinksembra essere relativo al genitore del target specificato.

Es .: Il genitore di /varè /, quindi private/varè corretto, rispetto a /. Per il mio esempio di cui sopra bin -> Applications, entrambi sono nella mia home directory, indipendentemente da dove lo eseguo, l'output è lo stesso.


3
readlink non ricorre nel caso in cui il link simbolico punti ad altri link simbolici. Non lo definirei "completamente risolto"
James Roth l'

Questo non sembra funzionare con la domanda di OP sui collegamenti simbolici a cose specificate con cose come ../...
user124384

18

Questo si risolve in modo ricorsivo e restituisce un percorso assoluto:

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

O la versione non interattiva:

python -c "import os; print(os.path.realpath('/usr/local/bin/python3'))"

1
Quando i builtin non riescono, ricorri agli script ... Bello. Sicuramente funziona: $ python -c "import os; print os.path.realpath('bin')">> /Users/jason/Applications. Collegamento simbolico ~ / bin a ~ / Applicazioni per avere un .bash_profile / $ PATH unificato su sistemi Mac e * nix.
Jason Salaz,

1
è fantastico e funziona bene! Lo contrassegnerei come risposta, tranne per il fatto che voglio anche sapere se esiste un modo per farlo nella shell come puoi fare su altri sistemi * nix.
Robert S Ciaccio,

1
Come si fa su altri sistemi * nix? Inoltre, Python è installato quasi universalmente sui sistemi Linux al giorno d'oggi.
Jason Salaz,

@vxjasonxv le cose che ho trovato quando stavo scherzando con questo hanno suggerito che i comandi pwde di cui findho parlato nella domanda risolvono il percorso completo su sistemi diversi da OS X. Non li ho testati comunque.
Robert S Ciaccio,


1

GNU coreutils-8.15 ha aggiunto nel 2012 un nuovo strumento da riga di comando realpathche fa quello che vuoi: risolve catene di collegamenti simbolici e genera il risultato come percorso assoluto (predefinito) o relativo.

Apple non include ancora realpathin MacOS (che purtroppo sembrano evitare tutti gli strumenti GPLv3), ma si può facilmente installare da soli, ad esempio utilizzando Homebrew: brew install coreutils.


-2

Puoi usare readlink -f. Richiama attraverso tutti i collegamenti. Supponiamo che il collegamento sia verso un percorso che è ulteriormente un collegamento. Vorresti avere il percorso assoluto finale.


Eh? Che cosa stai dicendo esattamente?
Rob,

La sintassi corretta per ciò che @DINESH SEHRA sta dicendo è usare read link -f python3per esempio e tamponerà il collegamento simbolico completo per te.
Danijel-James W,

3
Chiaramente non pubblicato da un utente OS X come -fmai esistito nella versione OS X di readlink.
Sorin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.