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 -s
komendy 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ć foo
w 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_link
do 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_link
po prostu zawiera link foo
do 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.
source_file
(pierwszy) to miejsce, w którym wskazuje link, czyli dosłownie to, co wpisujesz w poleceniu. Argumenttarget_file
(drugi) staje się nazwą łącza, chyba że wprowadzony katalog jest katalogiem, w którym to przypadku nazwa łącza jest taka sama jak nazwa basenowasource_file
ale umieszczona w katalogutarget_file
.ln
podręcznika,target
to pierwszy argument (gdzie punkty Link do ), natomiast drugi argument jest po prostu dalejlink
(source
nie wspomina).target
i drugilink
( man7.org/linux/man-pages/man1/ln.1.html ). Ale w BSD (w tym OS X) pierwszy jest wywoływany,source
a drugitarget
( freebsd.org/cgi/man.cgi?ln ). Całkiem mylące.Użycie flagi
-r
(--relative
) sprawi, że to zadziała:źródło
-r
jest to GNUism, tzn. Nie POSIX, więc nie będzie działać w przypadku OP, ponieważ standardoweln
polecenie OS X jest oparte na BSD.Aby zaoszczędzić trochę pisania, możesz to zrobić
źródło
*
,?
i[...]
).bash
, więc ogólnie dobrym pomysłem jest zacytowanie go. Mój zły, powinienem był być bardziej konkretny.Co powiesz na:
źródło