Réponses:
Un lien symbolique stocke le chemin que vous donnez littéralement, sous forme de chaîne¹. Cela signifie que votre lien ~/mylinkcontient " ." (un caractère). Lorsque vous accédez au lien, ce chemin est interprété par rapport à l'emplacement du lien, plutôt qu'à l'endroit où vous vous trouviez lorsque vous avez créé le lien.
Au lieu de cela, vous pouvez stocker le chemin réel que vous souhaitez dans le lien:
ln -s "$(pwd)" ~/mylink
en utilisant la substitution de commandes pour placer la sortie de pwd(le nom du répertoire de travail) dans votre ligne de commande. lnvoit le chemin complet et le stocke dans votre lien symbolique, qui pointera ensuite au bon endroit.
¹ Plus ou moins.
Tu devrais utiliser:
ln -s "$(cd . && pwd)" ~/mylink
ou:
ln -s "$(pwd -P)" ~/mylink
pour obtenir le bon résultat pour le répertoire de travail actuel. Il peut être modifié pendant que vous y travailliez comme dans cette question .
$PWD(le chemin qu'il a utilisé pour y arriver), plutôt que $(pwd -P)(le chemin canonique vers le répertoire courant). S'il $PWDne pointe plus vers le répertoire en cours, alors il n'y a pas de dicton qui le $(pwd -P)fera dans la minute suivante non plus.
"$PWD"avez toujours l'ancienne valeur si le répertoire actuel est déplacé. PWDdéfinir uniquement lorsque vous cdou initialiser par le shell.
cd n'y a pas de garantie que l' appel $ PWD ou la sortie de pwd un chemin vers le répertoire courant. Vous essayez de vous prémunir contre quelque chose qui ne risque pas de se produire, mais dans la première solution, ce n'est pas nécessairement efficace, et dans la seconde, cela change le comportement.
mv que vous faites après, vous lnvous retrouvez dans la même situation. D'un autre côté, s'il l'a fait cd /long/logical/path/to/some/directory, vous ne voulez pas que le lien pointe vers /vg0/lv1/user2/app4(le chemin canonique), car le lien pointera au mauvais endroit lorsqu'il /long/logical/path/to/some/directorypointe ailleurs.
"$PWD"dans les shells POSIX et~0danszsh.