La cible de symlink est-elle relative au directory parent de la destination et, dans l'affirmative, pourquoi?

J'ai la structure de file suivante:

build/ client/ –> index.js 

Et quand j'essaie de créer un lien symbolique nommé «client» dans le directory de construction qui se réfère au directory client dans le cwd comme tel

 // 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 

J'obtiens l'erreur ELOOP affichée ci-dessus. Quand je change le path cible pour être par rapport au path de destination, tout va bien:

 // Works $ pwd /home/user/ $ ln -s ../client build/client $ stat build/client/index.js stat: <outputs file stats> 

Est-ce le comportement prévu et s'il vous plaît expliquer pourquoi …

Pour celui qui ne fonctionne pas, si nous regardons le résultat ls -l , nous obtenons ce qui suit:

 [sparticvs@sparta test]$ ls -l build/ total 0 lrwxrwxrwx. 1 sparticvs sparticvs 6 Dec 17 16:08 client -> client 

Maintenant, pour comprendre ce qui se passe ici. Regardons la command que vous avez appelée:

 ln -s client build/client 

Selon la page Man, il y a deux correspondances possibles pour ce format

 SYNOPSIS ln [OPTION]... [-T] TARGET LINK_NAME (1st form) ln [OPTION]... TARGET... DIRECTORY (3rd form) 

Il correspondra sur la première forme (depuis sa première). Maintenant, le "nom cible" ou client dans votre cas, peut être (selon le manuel complet) des strings arbitraires. Ils n'ont pas à résoudre quoi que ce soit en ce moment, mais peuvent se résoudre à quelque chose dans le futur. Ce que vous créez avec votre invocation est un "lien symbolique suspendu" et le système ne vous empêche pas de les créer.

Maintenant, votre deuxième invocation en ln -s ../client build/client est ce qu'on appelle un "lien symbolique relatif" (comme vous l'avez noté dans votre propre post). Il y a un second type et c'est un "lien symbolique absolu" qui serait appelé en faisant ln -s /home/user/client build/client .

Ce n'est pas un bug. Selon le manuel, il est dit:

Lors de la création d'un lien symbolique relatif dans un location différent du directory actuel, la résolution du lien symbolique sera différente de la résolution de la même string du directory actuel. Par conséquent, de nombreux users préfèrent d'abord modifier les directorys à l'location où le lien symbolique relatif sera créé, de sorte que l'onglet-complétion ou autre résolution de file finda la même cible que ce qui sera placé dans le lien symbolique.

– d' info coreutils 'ln invocation'

Cela dit, vous devez utiliser le path relatif ou absolu vers la cible.

C'est en effet le comportement prévu. De la page man d' ln(1) :

Les liens symboliques peuvent contenir du text arbitraire; s'il est résolu plus tard, un lien relatif est interprété par rapport à son directory parent.

Quant au pourquoi de cela, imaginez si le lien symbolique a plutôt été interprété par rapport à sa source plutôt qu'à sa destination. Lorsque vous le résoudrez plus tard, vous devez savoir ce que votre CWD était quand vous l'avez créé, ce qui est impossible, encore less absurde.

De plus, vous obtenez ainsi une méthode compacte et soignée pour créer une structure de directorys squelettiques que vous pouvez déposer n'importe où dans l'arborescence sans interrompre les liens symboliques.

Pour vous donner un exemple de ce que je veux dire, disons que vous travaillez sur un projet et que vous avez configuré toute une structure de directorys comme ceci:

 $ ls -1 /home/you/project thingummies/ widgets/ wizardry/ 

Supposons maintenant que vous vouliez créer un lien symbolique vers widgets/ inside wizardry/ . Vous avez deux options:

 $ ln -s /home/you/project/widgets /home/you/project/wizardry 

ou

 $ ln -s ../widgets /home/you/project/wizardry 

Si vous essayez alors de déplacer /home/you/project ailleurs, un lien symbolique créé avec le premier formulaire se cassera car il search /home/you/project/widgets . Le deuxième formulaire gardera le lien symbolique fonctionnel car il search des ../widgets / ../widgets rapport à l'endroit où il se trouve, quel que soit l'endroit où il se trouve dans l'arborescence.