Pour celui qui ne fonctionne pas, si nous regardons le ls -l
résultat, 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 commande que vous avez appelée:
ln -s client build/client
Selon la page de manuel, il existe 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 ln
manuel complet ) des chaînes arbitraires. Ils n'ont pas à se résoudre à quoi que ce soit en ce moment, mais peuvent se résoudre à quelque chose à l'avenir. Ce que vous créez avec votre invocation est un "lien symbolique pendant" et le système ne vous empêche pas de les créer.
Maintenant, votre deuxième invocation ln -s ../client build/client
est ce qu'on appelle un "lien symbolique relatif" (comme vous l'avez noté dans votre propre article). Il existe un deuxième 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 indique:
Lors de la création d'un lien symbolique relatif à un emplacement différent du répertoire actuel, la résolution du lien symbolique sera différente de la résolution de la même chaîne du répertoire actuel. Par conséquent, de nombreux utilisateurs préfèrent d'abord modifier les répertoires à l'emplacement où le lien symbolique relatif sera créé, de sorte que la complétion de tabulation ou une autre résolution de fichier trouve la même cible que celle qui sera placée dans le lien symbolique.
-- de info coreutils 'ln invocation'
Cela dit, vous DEVEZ utiliser le chemin relatif ou absolu vers la cible.