web-dev-qa-db-fra.com

Trop de niveaux de liens symboliques

J'ai créé cette structure de fichiers:

test/src
test/firefox

Lorsque j'exécute cette commande:

ln -s test/src test/firefox

Je m'attendrais à un lien symbolique test/firefox/src à créer pointant vers test/src, mais j'obtiens plutôt cette erreur:

-bash: cd: src: Too many levels of symbolic links
  • Qu'est-ce que je fais mal?
  • Ne pouvez-vous pas créer un lien symbolique vers un dossier qui est stocké dans un frère de ce dossier?
  • À quoi ça sert?
111
David Zorychta

En surface, ce que vous avez suggéré d'avoir essayé 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

Vous avez donc probablement quelque chose d'autre à faire ici. Je soupçonne que vous avez une référence circulaire où un lien pointe vers lui-même.

Vous pouvez utiliser find pour extraire cela un peu:

$ cd /suspected/directory
$ find -L ./ -mindepth 15
35
slm

Comme Dubu le souligne dans un commentaire, le problème réside dans vos chemins relatifs. J'ai rencontré un problème similaire en associant 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 créer 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
185
Steen Schütt

Les liens symboliques sont relatifs au répertoire parent du lien, et non au répertoire courant du processus ln.

Quand vous faites:

cd /top/dir
ln -s test/src test/firefox

(où test/firefox est un répertoire), vous créez un test/firefox/src lien symbolique dont la cible est test/src.

Cette test/src est relatif à test/firefox répertoire, c'est donc 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 cassés 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 option pour le laisser faire le calcul par lui-même:

$ ln -rs test/src test/firefox/
$ ls -ld test/firefox/src
lrwxrwxrwx 1 chazelas chazelas 6 Nov 29 15:59 test/firefox/src -> ../src
9
Stéphane Chazelas

Utilisez le chemin absolu au lieu du chemin relatif, cela fonctionnera.

Par exemple:

ln -s /home/user/test/src /home/user/test/firefox
6
JISHNU T U

La réponse est d'utiliser un chemin absolu. Mais il peut être ennuyeux de taper le chemin d'accès complet pour quelque chose qui se trouve dans le répertoire courant. Vous pouvez utiliser la substitution de commande de pwd pour éviter cela. Si votre cible se trouve dans le répertoire actuel:

ln -s "$(pwd)"/target abs/path/to/link 

Si votre lien doit se trouver dans le répertoire actuel:

ln -s /abs/path/to/target "$(pwd)"
1
breadnbeer