¿Ln -s requiere que esté en un directorio determinado?

¿Ln -s requiere que esté en un directorio determinado?

Quiero crear un enlace simbólico simple a un archivo.

Funciona perfectamente si ejecuto el comando desde el directorio donde quiero que se cree el enlace simbólico:

/path/to/link $ ln -s /path/to/file .

Pero si estoy en cualquier otro directorio, se crea un enlace roto cada vez:

/any/other/path $ ln -s /path/to/file /path/to/link

¿Es ln -snecesario que esté en un directorio determinado o me falta algo? Ejecutando Ubuntu 10.04.

Actualizar:Perdón por la confusión sobre si las rutas eran relativas o absolutas. Eran relativos y, como varios mencionaron en sus respuestas, esta fue la fuente de mi problema. ¡Gracias!

Respuesta1

Si no está en el mismo directorio que el destino, debe asegurarse de utilizar la ruta absoluta.

ln -s foo/bar baz/quux # fails

ln -s ~/foo/bar baz/quux # succeeds

Respuesta2

tiendo a usar

ln -s $(pwd)/local_file /path/to/link

cuando necesito vincular un archivo local.

Respuesta3

Esto siempre me resulta poco intuitivo. Me acostumbro a hacer:

ln -s $(readlink -f /path/to/file) /path/to/link

que debería funcionar, pero a costa de hacerlo no relativo en el enlace real en el disco.

Respuesta4

En realidad, no se trata en sí mismo del directorio en el que se encuentra. Se trata de qué enlace simbólico creas: los enlaces simbólicos son solo archivos que contienen una ruta que apunta a un archivo. Puede crear enlaces simbólicos que contengan rutas que comiencen con el /carácter o enlaces simbólicos que no comiencen con ese carácter. Puede crear enlaces simbólicos que contengan ..componentes de ruta y enlaces simbólicos que no los contengan. Cuando los programas resuelven enlaces simbólicos para encontrar el archivo de destino, interpretan la ruta como relativa al directorio que contiene el enlace simbólico. Entonces sólo necesitas asegurarte de que el enlace simbólico tenga la ruta que deseas.

Aquí hay una forma similar a la respuesta de Matthew Flaschen, pero aquí haciendo unarelativoenlace simbólico:

/tmp$ mkdir -p spam/eggs/ham
/tmp$ mkdir foo
/tmp$ python -c "import os, sys; print os.path.relpath(sys.argv[1], os.path.abspath(sys.argv[2])), sys.argv[2]" $(readlink -e foo) spam/eggs/ham  | xargs ln -s 
/tmp$ ls -l spam/eggs/ham/foo
lrwxrwxrwx 1 user user 12 2012-02-05 15:12 spam/eggs/ham/foo -> ../../../foo

No hay duda de que eso también se podría hacer en Bourne/bash Shell puro, pero es fácil escribir (y leer) esto correctamente en Python.

información relacionada