Odpowiedzi:
Dowiązanie symboliczne faktycznie przechowuje ścieżkę, którą podajesz dosłownie, jako ciąg znaków¹. Oznacza to, że Twój link ~/mylink
zawiera „ .
” (jeden znak). Gdy uzyskujesz dostęp do łącza, ścieżka jest interpretowana w odniesieniu do tego, gdzie jest link, a nie w miejscu, w którym byłeś, kiedy tworzyłeś link.
Zamiast tego możesz zapisać aktualną ścieżkę w linku:
ln -s "$(pwd)" ~/mylink
za pomocą podstawiania poleceń, aby umieścić dane wyjściowe pwd
(nazwa katalogu roboczego) w wierszu polecenia. ln
widzi pełną ścieżkę i zapisuje ją w dowiązaniu symbolicznym, które następnie wskaże właściwe miejsce.
¹ Mniej więcej.
Powinieneś użyć:
ln -s "$(cd . && pwd)" ~/mylink
lub:
ln -s "$(pwd -P)" ~/mylink
aby uzyskać właściwy wynik dla bieżącego katalogu roboczego. Można to zmienić podczas pracy nad nim, tak jak w tym pytaniu .
$PWD
(ścieżki, którą się tam znalazł), a nie $(pwd -P)
(ścieżki kanonicznej do bieżącego katalogu). Jeśli $PWD
nie będzie już wskazywał na bieżący katalog, nie będzie też mowy o tym $(pwd -P)
w następnej minucie.
"$PWD"
przeniesiony zostanie bieżący katalog, nadal możesz mieć starą wartość. PWD
ustawiane tylko podczas cd
inicjowania lub inicjowania przez powłokę.
cd
nie jest gwarantowane $ PWD lub wyjście pwd ścieżka do bieżącego katalogu. Próbujesz uchronić się przed czymś, co prawdopodobnie się nie wydarzy, ale w pierwszym rozwiązaniu niekoniecznie jest to skuteczne, a w drugim zmienia zachowanie.
mv
po to zrobisz ln
, to kończy się w tej samej sytuacji. Z drugiej strony, jeśli tak cd /long/logical/path/to/some/directory
, nie chcesz, aby link wskazywał /vg0/lv1/user2/app4
(ścieżkę kanoniczną), ponieważ link wskaże niewłaściwe miejsce, gdy wskaże /long/logical/path/to/some/directory
gdzieś indziej.
"$PWD"
w powłokach POSIX i~0
wzsh
.