Próbuję utworzyć kilka dowiązań symbolicznych, ale nie mogę zrozumieć, dlaczego to działa
ln -s /Users/niels/something/foo ~/bin/foo_link
podczas gdy to
cd /Users/niels/something ln -s foo ~/bin/foo_link
nie.
Myślę, że ma to coś wspólnego z foo_link
linkiem do foo w /Users/niels/bin
zamiast /Users/niels/something
Zatem pytanie brzmi, jak utworzyć dowiązanie symboliczne wskazujące na ścieżkę bezwzględną, bez jej wpisywania?
Dla porównania używam Mac OS X 10.9 i Zsh .
Odpowiedź
Najłatwiejszym sposobem utworzenia linku do bieżącego katalogu jako ścieżki bezwzględnej, bez wpisywania całej ścieżki, byłoby
ln -s "$(pwd)/foo" ~/bin/foo_link
target
(pierwszy) argument dla ln -s
polecenie działa względem lokalizacji dowiązania symbolicznego, a nie bieżącego katalogu. Warto wiedzieć, że zasadniczo kreacja ed symlink (drugi argument) po prostu przechowuje tekst , który podasz jako pierwszy argument.
Dlatego jeśli wykonasz następujące czynności:
cd some_directory ln -s foo foo_link
, a następnie przesuń ten link w inne miejsce
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 linkami symbolicznymi wskazującymi na ścieżki względne. Jeśli wykonasz następujące czynności:
ln -s ../foo yet_another_link
, a następnie przenieś yet_another_link
do innego katalogu i sprawdź, gdzie wskazuje, zobaczysz, że zawsze wskazuje na ../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 przechowuje link do foo
, względny w stosunku do jego lokalizacji. Umieszczenie $(pwd)
przed nazwą argumentu docelowego po prostu dodaje bieżący katalog roboczy bezwzględna ścieżka, tak aby link został utworzony z bezwzględnym celem.
Komentarze
Odpowiedź
Używając -r
(--relative
) sprawi, że to zadziała:
ln -sr foo ~/bin/foo_link
Komentarze
- Uważaj, że
-r
jest GNUizmem, tzn. nie POSIX, więc wygrał ' nie działa w przypadku OP jako standardowy OS Xln
jest oparte na BSD.
Odpowiedź
Aby zapisać wpisując, możesz zrobić
ln -s "$PWD"/foo ~/bin/foo_link
Komentarze
- @Freddy, to zależy od powłoki. W fish lub zsh byłoby OK.W powłokach podobnych do Bournea, w tym bash i z domyślną wartością $ IFS, SPC rzeczywiście stanowiłoby problem, ale także TAB, NL i wszystkie znaki globbingu (przynajmniej
*
,?
i[...]
). - @St é phaneChazelas Tak, ty ' dobrze, a pytanie jest oznaczone tagiem
bash
, więc ' jest ogólnie dobry pomysł, żeby to zacytować. Mój błąd, powinienem był być bardziej szczegółowy.
Odpowiedź
A co powiesz na:
$ cd /Users/niels/something $ ln -s ./foo ~/bin/foo_link
Komentarze
- Nie, nie ' nie załatwia sprawy.
source_file
(pierwszy) argument to miejsce, w którym wskazuje łącze, czyli dosłownie to, co wpisujesz w poleceniu. Argumenttarget_file
(drugi) staje się nazwą odsyłacza, chyba że wpisany jest katalogiem, w którym to przypadku nazwa linku jest taka sama, jak podstawowa nazwasource_file
ale umieszczony w katalogutarget_file
.ln
target
jest pierwszym argumentem (gdzie odsyłacz wskazuje do ), podczas gdy drugi argument jest po prostu nazywanylink
(nie wspomina się osource
).target
, a drugilink
( man7.org/ linux / man-pages / man1 / ln.1.html ). Ale w BSD (w tym OS X) pierwsza nazywa sięsource
, a drugatarget
( freebsd.org/cgi/man.cgi?ln ). Dość mylące.