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.