Réponses:
Un lien symbolique stocke le chemin que vous donnez littéralement, sous forme de chaîne¹. Cela signifie que votre lien ~/mylink
contient " .
" (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. ln
voit 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 $PWD
ne 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é. PWD
définir uniquement lorsque vous cd
ou 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 ln
vous 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/directory
pointe ailleurs.
"$PWD"
dans les shells POSIX et~0
danszsh
.