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.
Pierwszy niekoniecznie pomoże we wszystkich powłokach (zobacz tę odpowiedź ). OP najprawdopodobniej chce użyć $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.
@ StéphaneChazelas: Jeśli "$PWD"przeniesiony zostanie bieżący katalog, nadal możesz mieć starą wartość. PWDustawiane tylko podczas cdinicjowania lub inicjowania przez powłokę.
cuonglm
Ale mówię, że OP może chcieć starego $ PWD niż jakiejkolwiek bezwzględnej ścieżki do bieżącego katalogu roboczego i że w kilku powłokach (ksh93, ash, yash), jak wyjaśniono , wywołanie 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.
Stéphane Chazelas
1
Jeśli ktoś robi to mvpo 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~0
wzsh
.Powinieneś użyć:
lub:
aby uzyskać właściwy wynik dla bieżącego katalogu roboczego. Można to zmienić podczas pracy nad nim, tak jak w tym pytaniu .
źródło
$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 podczascd
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 zrobiszln
, to kończy się w tej samej sytuacji. Z drugiej strony, jeśli takcd /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.