Odpowiedzi:
Dowiązanie symboliczne faktycznie przechowuje ścieżkę, którą podajesz dosłownie, jako ciąg znaków¹. Oznacza to, że Twój link ~/mylinkzawiera „ .” (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. lnwidzi 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 $PWDnie 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ść. PWDustawiane tylko podczas cdinicjowania lub inicjowania przez powłokę.
cdnie 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/directorygdzieś indziej.
"$PWD"w powłokach POSIX i~0wzsh.