Como señala Dubu en un comentario, el problema radica en sus rutas relativas. Tuve un problema similar al enlazar mi configuración nginx desde /usr/local/etc/nginx
a /etc/nginx
. Si crea su enlace simbólico así:
cd /usr/local/etc
ln -s nginx/ /etc/nginx
De hecho, creará el enlace /etc/nginx -> /etc/nginx, porque la ruta de origen es relativa a la ruta del enlace. La solución es tan simple como usar rutas absolutas:
ln -s /usr/local/etc/nginx /etc/nginx
Si quiere usar rutas relativas y hacer que se comporten de la manera que probablemente espera, puede usar pwd
para poner la ruta del directorio de trabajo actual, así:
cd /usr/local/etc
ln -s "$(pwd)/nginx/" /etc/nginx
Le gustaría tener las comillas alrededor de la ruta, para asegurarse de que se escapen cosas como espacios en su ruta actual. Tenga en cuenta que debe usar comillas dobles al hacer esto, como $(pwd)
no se sustituirá si usa comillas simples.
En la superficie, lo que sugirió que intentó funciona para mí.
Ejemplo
$ mkdir -p test/src test/firefox
$ tree --noreport -fp
.
`-- [drwxrwxr-x] ./test
|-- [drwxrwxr-x] ./test/firefox
`-- [drwxrwxr-x] ./test/src
Haga el enlace simbólico:
$ ln -s test/src test/firefox
$ tree --noreport -fp
.
`-- [drwxrwxr-x] ./test
|-- [drwxrwxr-x] ./test/firefox
| `-- [lrwxrwxrwx] ./test/firefox/src -> test/src
`-- [drwxrwxr-x] ./test/src
Ejecutarlo por segunda vez normalmente produciría esto:
$ ln -s test/src test/firefox
ln: failed to create symbolic link ‘test/firefox/src’: File exists
Así que es probable que tengas algo más aquí. Sospecho que tiene una referencia circular donde un enlace apunta hacia sí mismo.
Puedes usar find
para investigar esto un poco:
$ cd /suspected/directory
$ find -L ./ -mindepth 15
Los enlaces simbólicos son relativos al directorio principal del enlace, no al directorio actual del ln
proceso.
Cuando lo haces:
cd /top/dir
ln -s test/src test/firefox
(donde test/firefox
es un directorio), estás haciendo un test/firefox/src
enlace simbólico cuyo objetivo es test/src
.
Ese test/src
es relativo al test/firefox
directorio, por lo que es un enlace simbólico a /top/dir/test/firefox/test/src
.
Si quisiera que ese enlace simbólico fuera un enlace a /top/dir/test/src
, tendrías que escribir:
ln -s ../src test/firefox/
O
ln -s /top/dir/test/src test/firefox/
aunque generalmente es una mala idea hacer enlaces simbólicos a rutas absolutas, ya que se rompen fácilmente cuando se cambia el nombre de los directorios o los sistemas de archivos se montan en otro lugar.
Con GNU ln
, puede usar su -r
opción para dejar que haga el cálculo por sí mismo:
$ ln -rs test/src test/firefox/
$ ls -ld test/firefox/src
lrwxrwxrwx 1 chazelas chazelas 6 Nov 29 15:59 test/firefox/src -> ../src