Tengo la siguiente estructura de archivos:
build/
client/
–> index.js
Y cuando trato de crear un enlace simbólico llamado "cliente" dentro del directorio de compilación que se refiere al directorio del cliente en el cwd así
// Fails
$ pwd
/home/user/
$ ln -s client build/client
$ stat build/client/index.js
stat: build/client/index.js: stat: Too many levels of symbolic links
Me sale el error ELOOP que se muestra arriba. Cuando cambio la ruta de destino para que sea relativa a la ruta de destino, todo está bien:
// Works
$ pwd
/home/user/
$ ln -s ../client build/client
$ stat build/client/index.js
stat: <outputs file stats>
¿Es este el comportamiento previsto y explique por qué ...
Respuestas:
Para el que no funciona, si miramos el
ls -l
resultado, obtenemos lo siguiente:Ahora para entender lo que está pasando aquí. Veamos el comando que llamaste:
Según la página del manual, hay dos posibles coincidencias para este formato
Coincidirá en la primera forma (desde su primera). Ahora, el "nombre de destino" o
client
en su caso, pueden ser (según elln
manual completo ) cadenas arbitrarias. No tienen que resolver nada en este momento, pero pueden resolver algo en el futuro. Lo que está creando con su invocación es un "enlace simbólico colgante" y el sistema no le impide crearlos.Ahora su segunda invocación
ln -s ../client build/client
es lo que se llama un "enlace simbólico relativo" (como señaló en su propia publicación). Hay un segundo tipo y es un "enlace simbólico absoluto" al que se llamaría haciendoln -s /home/user/client build/client
.Esto no es un error. Según el manual dice:
Dicho esto, DEBE utilizar la ruta relativa o absoluta al objetivo.
fuente
Este es de hecho el comportamiento previsto. Desde la
ln(1)
página del manual:En cuanto a por qué, imagínese si el enlace simbólico se interpretara en lugar de su origen en lugar de su destino. Cuando más tarde lo resuelva, necesitará saber cuál era su CWD cuando lo creó, lo cual no tiene sentido, y mucho menos es imposible.
Además, de esta manera obtienes un método ordenado y compacto para crear una estructura de directorio esqueleto que puedes colocar en cualquier lugar del árbol de directorios sin romper los enlaces simbólicos.
Para darle un ejemplo de lo que quiero decir, supongamos que está trabajando en un proyecto y tiene una estructura de directorios completa configurada de esta manera:
Ahora suponga que desea crear un enlace simbólico al
widgets/
interiorwizardry/
. Tienes dos opciones:o
Si luego intentas
/home/you/project
moverte a otro lugar, un enlace simbólico creado con el primer formulario se romperá porque está buscando/home/you/project/widgets
. La segunda forma mantendrá el enlace simbólico funcional porque está buscando en../widgets
relación con el lugar en el que se encuentra, independientemente de dónde pueda estar ese lugar en el árbol de directorios.fuente