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

39

Tengo un desorden enredado de instalaciones de python en mi computadora portátil. Estaba viendo los ejecutables en /usr/local/bin y todos ellos son enlaces simbólicos a ../../../Library......

Hay un comportamiento extraño alrededor de esto. Si 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, 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 sobre el uso de pwd -P y la utilidad find para hacer esto. El problema es que estos no parecen funcionar en OS X de la manera en que las personas los describen trabajando en Linux (es decir, que generan la ruta completa al enlace simbólico). Simplemente imprimen la ruta de los 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 sobre lo que está pasando aquí?

    
pregunta Robert S Ciaccio 10.12.2010 - 18:13

5 respuestas

29

Creo que pwd -P y readlink serán tus amigos para esta tarea.

" Cómo puede Obtengo el comportamiento del enlace de lectura de GNU -f en una Mac? "es un recurso útil.

pwd -P solo funciona si está 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 destino (por lo tanto, puede usarse contra archivos):

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

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

La salida de readlink parece ser relativa al padre del objetivo especificado.

Ejemplo: el padre de /var es / , por lo que private/var es correcto, relativo a / . Según mi ejemplo anterior de bin -> Applications , ambos están en mi Directorio principal, no importa donde lo ejecute, la salida es la misma.

    
respondido por el Jason Salaz 28.04.2011 - 22:12
16

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'))"
    
respondido por el James Roth 10.12.2010 - 22:20
2

Quizás esta discusión sobre Desbordamiento de pila sea de ayuda: Cómo para resolver enlaces simbólicos en un script de shell En particular, considere esta respuesta .

    
respondido por el simonair 28.04.2011 - 14:40
1

GNU coreutils-8.15 agregó en 2012 una nueva herramienta de línea de comandos realpath que 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 realpath en macOS (lamentablemente parecen rechazar todas las herramientas GPLv3), pero puedes instalarlo fácilmente tú mismo, por ejemplo. utilizando Homebrew: brew install coreutils .

    
respondido por el Markus Kuhn 18.01.2018 - 12:21
-2

Puedes usar readlink -f . Recurre 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.

    
respondido por el DINESH SEHRA 27.01.2014 - 08:06

Lea otras preguntas en las etiquetas