¿Cómo obtener la ruta completamente resuelta de un enlace simbólico en la Terminal?

47

Tengo un lío enredado de instalaciones de Python en mi computadora portátil. Estaba mirando los ejecutables /usr/local/biny todos son enlaces simbólicos a../../../Library......

Hay un comportamiento extraño que rodea esto. Si lo hago ls -lhaG, veo --->y la ruta relativa a la derecha de los enlaces simbólicos:

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

Sin embargo, parece que no puedo obtener ninguna de las herramientas de línea de comandos para resolver esa ruta y mostrar la ruta real a python3. He encontrado algunos datos aquí y allá sobre el uso pwd -Py la findutilidad para hacer esto. El problema es que estos no parecen funcionar en OS X de la forma en que las personas los describen trabajando en Linux (es decir, mostrando la ruta completa al enlace simbólico). Simplemente imprimen la ruta de enlaces simbólicos para mí:

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

¿Alguna idea de lo que está pasando aquí?

Robert S Ciaccio
fuente

Respuestas:

36

Creo eso pwd -Py readlinkserán sus amigos para esta tarea.

" ¿Cómo puedo obtener el comportamiento del readlink -f de GNU en una Mac? " Es un recurso útil.

pwd -P solo funciona si estás dentro del directorio de enlaces simbólicos:

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

readlink funciona especificando el objetivo (por lo tanto, se puede usar contra archivos):

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

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

El resultado de readlinkparece ser relativo al padre del objetivo especificado.

Ej: El padre de /vares /, así que private/vares correcto, relativo a /. Según mi ejemplo anterior de bin -> Applications, ambos están en mi Directorio de inicio, no importa dónde lo ejecute, el resultado es el mismo.

Jason Salaz
fuente
3
readlink no se repite a través del caso donde el enlace simbólico apunta a otros enlaces simbólicos. No lo llamaría "totalmente resuelto"
James Roth
Esto no parece funcionar con la pregunta de OP sobre enlaces simbólicos a cosas especificadas con cosas como ../...
usuario124384
18

Esto se resuelve recursivamente y devuelve una ruta absoluta:

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

O la versión no interactiva:

python -c "import os; print(os.path.realpath('/usr/local/bin/python3'))"
James Roth
fuente
1
Cuando las construcciones te fallan, recurre a las secuencias de comandos ... Bien. Definitivamente funciona: $ python -c "import os; print os.path.realpath('bin')">> /Users/jason/Applications. Enlace simbólico ~ / bin a ~ / Aplicaciones para tener un .bash_profile / $ PATH unificado en los sistemas Mac y * nix.
Jason Salaz
1
¡Esto es genial y funciona bien! Lo marcaría como la respuesta, excepto que también quiero saber si hay una manera de hacer esto en el shell como puede hacerlo en otros sistemas * nix.
Robert S Ciaccio
1
¿Cómo lo haces en otros sistemas * nix? Además, Python está instalado casi universalmente en sistemas Linux hoy en día.
Jason Salaz
@vxjasonxv las cosas que encontré en el momento en que estaba jugando con esto sugirieron que los comandos pwdy de los findque hablé en la pregunta resuelven la ruta completa en sistemas que no sean OS X. Sin embargo, no los he probado.
Robert S Ciaccio
1

GNU coreutils-8.15 agregó en 2012 una nueva herramienta de línea de comandos realpathque hace lo que quiere: resuelve cadenas de enlaces simbólicos y genera el resultado como una ruta absoluta (predeterminada) o relativa.

Apple aún no incluye realpathen macOS (que parecen tristemente a rechazar todas las herramientas GPLv3), pero se puede instalar fácilmente por sí mismo, por ejemplo, utilizando Homebrew: brew install coreutils.

Markus Kuhn
fuente
-2

Puedes usar readlink -f. Se repite a través de todos los enlaces. Supongamos que el enlace es a una ruta que es más un enlace. Te gustaría tener el camino absoluto final.

DINESH SEHRA
fuente
¿Eh? ¿Qué estás diciendo exactamente?
Rob
La sintaxis correcta de lo que dice @DINESH SEHRA es utilizar, read link -f python3por ejemplo, y almacenará el enlace simbólico completo para usted.
Danijel-James W
3
Claramente no publicado por un usuario de OS X, ya que -fnunca existió en la versión de OS X de readlink.
sorin