ln -s ze ścieżką względem pwd

26

Próbuję utworzyć kilka dowiązań symbolicznych, ale nie mogę zrozumieć, dlaczego to działa

ln -s /Users/niels/something/foo ~/bin/foo_link

kiedy to

cd /Users/niels/something
ln -s foo ~/bin/foo_link

nie jest.

Uważam, że ma to coś wspólnego z foo_linklinkowaniem do foo /Users/niels/binzamiast/Users/niels/something

Pytanie brzmi: w jaki sposób mogę utworzyć dowiązanie symboliczne, które wskazuje na ścieżkę bezwzględną, bez jej wpisywania?

Dla porównania używam Mac OS X 10.9 i Zsh.

Niels B.
źródło

Odpowiedzi:

33

Najprostszym sposobem na połączenie z bieżącym katalogiem jako ścieżką bezwzględną, bez wpisywania całego ciągu ścieżki byłoby

ln -s "$(pwd)/foo" ~/bin/foo_link

target(Pierwszy) argumentem dla ln -skomendy działa w stosunku do lokalizacji dowiązania symbolicznego, a nie aktualnym katalogu. Pomaga wiedzieć, że zasadniczo utworzone dowiązanie symboliczne (drugi argument) po prostu przechowuje tekst podany dla pierwszego argumentu.

Dlatego jeśli wykonasz następujące czynności:

cd some_directory
ln -s foo foo_link

a następnie przenieś ten link

mv foo_link ../some_other_directory
ls -l ../some_other_directory

zobaczysz, że foo_link próbuje wskazać foow katalogu, w którym się znajduje. Działa to również z dowiązaniami symbolicznymi wskazującymi ścieżki względne. Jeśli wykonasz następujące czynności:

ln -s ../foo yet_another_link

a następnie przejdź yet_another_linkdo innego katalogu i sprawdź, gdzie wskazuje, zobaczysz, że zawsze wskazuje ../foo. Jest to zamierzone zachowanie, ponieważ wiele razy dowiązania symboliczne mogą być częścią struktury katalogów, która może znajdować się w różnych ścieżkach bezwzględnych.

W twoim przypadku, kiedy tworzysz link, wpisując

ln -s foo ~/bin/foo_link

foo_linkpo prostu zawiera link foodo jego lokalizacji. Umieszczenie $(pwd)przed nazwą argumentu docelowego po prostu dodaje ścieżkę bezwzględną bieżącego katalogu roboczego, dzięki czemu łącze jest tworzone z bezwzględnym celem.

Achilleas
źródło
„... pomaga sobie wyobrazić, że utworzone dowiązanie symboliczne po prostu zawiera tekst ...” Czy to nie jest dosłowna prawda?
Wildcard
1
To jest. Być może mógłbym zmienić wyobrażenie na „wiedzieć” lub „rozumieć”.
Achilleas,
Być może się zdezorientowałem (ponownie). Wydaje się, że gdzie mówisz „cel”, masz na myśli „źródło”. Argument source_file(pierwszy) to miejsce, w którym wskazuje link, czyli dosłownie to, co wpisujesz w poleceniu. Argument target_file(drugi) staje się nazwą łącza, chyba że wprowadzony katalog jest katalogiem, w którym to przypadku nazwa łącza jest taka sama jak nazwa basenowa source_fileale umieszczona w katalogu target_file.
Charlie Gorichanaz,
Masz rację, ̶ ̶t̶h̶e̶r̶e̶'̶s̶ błąd w ̶a̶n̶s̶w̶e̶r̶.̶ Szalony JAK się nie zdarzyło złapany ̶s̶o̶o̶n̶e̶r̶.̶ ̶F̶i̶x̶i̶n̶g̶.̶ Nie, odpowiedź była właściwa. Przez lnpodręcznika, targetto pierwszy argument (gdzie punkty Link do ), natomiast drugi argument jest po prostu dalej link( sourcenie wspomina).
Achilleas,
3
W Linuksie (gnu ln) strona man wywołuje pierwszy argument targeti drugi link( man7.org/linux/man-pages/man1/ln.1.html ). Ale w BSD (w tym OS X) pierwszy jest wywoływany, sourcea drugi target( freebsd.org/cgi/man.cgi?ln ). Całkiem mylące.
cristoper
5

Użycie flagi -r( --relative) sprawi, że to zadziała:

ln -sr foo ~/bin/foo_link
Geremia
źródło
4
Uwaga, -rjest to GNUism, tzn. Nie POSIX, więc nie będzie działać w przypadku OP, ponieważ standardowe lnpolecenie OS X jest oparte na BSD.
jlliagre
2

Aby zaoszczędzić trochę pisania, możesz to zrobić

ln -s "$PWD"/foo ~/bin/foo_link
cosinus
źródło
@ Freddy, to zależy od powłoki. W przypadku ryb lub zsh byłoby OK. W Bourne-jak muszli tym bash oraz z domyślną wartością $ IFS, SPC rzeczywiście być problem, ale również TAB, NL i wszystkie znaki uogólniające (co najmniej *, ?i [...]).
Stéphane Chazelas
@ StéphaneChazelas Tak, masz rację, a pytanie jest otagowane bash, więc ogólnie dobrym pomysłem jest zacytowanie go. Mój zły, powinienem był być bardziej konkretny.
Freddy
0

Co powiesz na:

 $ cd /Users/niels/something
 $ ln -s ./foo ~/bin/foo_link
ptierno
źródło
1
Nie, nie załatwia sprawy.
Niels B.