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

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

  • " … pomaga wyobrazić sobie , że utworzone łącze symboliczne zawiera po prostu tekst …. " Isn ' czy to jest dosłowna prawda?
  • Tak. Być może mógłbym zmienić imagine na " know " lub " rozumiem ".
  • Być może pomyliłem się (znowu). Wygląda na to, że gdzie mówisz " cel " masz na myśli " źródło ". source_file (pierwszy) argument to miejsce, w którym wskazuje łącze, czyli dosłownie to, co wpisujesz w poleceniu. Argument target_file (drugi) staje się nazwą odsyłacza, chyba że wpisany jest katalogiem, w którym to przypadku nazwa linku jest taka sama, jak podstawowa nazwa source_file ale umieszczony w katalogu target_file.
  • Y̶o̶u̶ ' ̶r̶e̶ ̶r̶i̶g̶h̶t̶, ̶ ̶t̶e̶̶e ' s błąd w ̶a̶n̶s̶w̶e̶r̶.̶ szalony jak to nie zrobił ' T złapany ̶s̶o̶o̶n̶e̶r̶.̶ ̶F̶i̶x̶i̶n̶g̶.̶ Nie, odpowiedź była dobrze. Na stronie podręcznika ln target jest pierwszym argumentem (gdzie odsyłacz wskazuje do ), podczas gdy drugi argument jest po prostu nazywany link (nie wspomina się o source).
  • W systemie Linux (gnu ln) Strona podręcznika wywołuje pierwszy argument target, a drugi link ( man7.org/ linux / man-pages / man1 / ln.1.html ). Ale w BSD (w tym OS X) pierwsza nazywa się source, a druga target ( freebsd.org/cgi/man.cgi?ln ). Dość mylące.

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 X ln 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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *