Comme le souligne Dubu dans un commentaire, le problème réside dans vos chemins relatifs. J'ai eu un problème similaire en liant symboliquement ma configuration nginx à partir de /usr/local/etc/nginx
à /etc/nginx
. Si vous créez votre lien symbolique comme ceci :
cd /usr/local/etc
ln -s nginx/ /etc/nginx
Vous allez en fait faire le lien /etc/nginx -> /etc/nginx, car le chemin source est relatif au chemin du lien. La solution est aussi simple que d'utiliser des chemins absolus :
ln -s /usr/local/etc/nginx /etc/nginx
Si vous souhaitez utiliser des chemins relatifs et qu'ils se comportent comme vous vous y attendez probablement, vous pouvez utiliser pwd
pour mettre le chemin du répertoire de travail actuel, comme ceci :
cd /usr/local/etc
ln -s "$(pwd)/nginx/" /etc/nginx
Vous voudriez avoir les guillemets autour du chemin, pour vous assurer que des choses comme les espaces dans votre chemin actuel sont échappées. Notez que vous devez utiliser des guillemets doubles lorsque vous faites cela, comme $(pwd)
ne sera pas remplacé si vous utilisez des guillemets simples.
En surface, ce que vous avez suggéré d'essayer fonctionne pour moi.
Exemple
$ mkdir -p test/src test/firefox
$ tree --noreport -fp
.
`-- [drwxrwxr-x] ./test
|-- [drwxrwxr-x] ./test/firefox
`-- [drwxrwxr-x] ./test/src
Faire le lien symbolique :
$ 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
L'exécuter une deuxième fois produirait généralement ceci :
$ ln -s test/src test/firefox
ln: failed to create symbolic link ‘test/firefox/src’: File exists
Donc, vous avez probablement quelque chose d'autre qui se passe ici. Je suppose que vous avez une référence circulaire où un lien pointe vers lui-même.
Vous pouvez utiliser find
pour démêler un peu ça :
$ cd /suspected/directory
$ find -L ./ -mindepth 15
Les liens symboliques sont relatifs au répertoire parent du lien, pas au répertoire courant du ln
processus.
Lorsque vous faites :
cd /top/dir
ln -s test/src test/firefox
(où test/firefox
est un répertoire), vous faites un test/firefox/src
lien symbolique dont la cible est test/src
.
Ce test/src
est relatif au test/firefox
répertoire, donc c'est un lien symbolique vers /top/dir/test/firefox/test/src
.
Si vous vouliez que ce lien symbolique soit un lien vers /top/dir/test/src
, vous devez écrire :
ln -s ../src test/firefox/
Ou
ln -s /top/dir/test/src test/firefox/
bien que ce soit généralement une mauvaise idée de créer des liens symboliques vers des chemins absolus car ils sont facilement rompus lorsque les répertoires sont renommés ou que les systèmes de fichiers sont montés ailleurs.
Avec GNU ln
, vous pouvez utiliser son -r
possibilité de le laisser faire le calcul tout seul :
$ ln -rs test/src test/firefox/
$ ls -ld test/firefox/src
lrwxrwxrwx 1 chazelas chazelas 6 Nov 29 15:59 test/firefox/src -> ../src