ln -s med en sökväg i förhållande till pwd

Jag försöker skapa en massa symboliska länkar, men jag kan inte räkna ut varför det fungerar

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

medan detta

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

inte är det.

Jag tror att det har något att göra med att foo_link länkar till foo i /Users/niels/bin istället för /Users/niels/something

Så frågan är, hur skapar jag en symbolisk länk som pekar på en absolut sökväg utan att egentligen skriva den?

Som referens använder jag Mac OS X 10.9 och Zsh .

Svar

Det enklaste sättet att länka till den aktuella katalogen som en absolut sökväg utan att skriva hela söksträngen

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

target (första) argumentet för ln -s kommandot fungerar relativt till den symboliska länkens plats, inte din nuvarande katalog. Det hjälper att veta att i huvudsak skaparen ed symlink (det andra argumentet) innehåller helt enkelt texten som du anger för det första argumentet.

Om du gör följande:

cd some_directory ln -s foo foo_link 

och flytta sedan länken runt

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

så ser du att foo_link försöker att peka på foo i katalogen det finns i. Detta fungerar också med symboliska länkar som pekar på relativa sökvägar. Om du gör följande:

ln -s ../foo yet_another_link 

och flytta sedan yet_another_link till en annan katalog och kontrollera var den pekar på, du kommer att se att det alltid pekar på ../foo. Detta är det avsedda beteendet, eftersom symboliska länkar många gånger kan vara en del av en katalogstruktur som kan ligga i olika absoluta banor. p>

I ditt fall, när du skapar länken genom att skriva

ln -s foo ~/bin/foo_link 

foo_link håller bara en länk till foo, relativt dess plats. Att sätta $(pwd) framför målargumentets namn lägger bara till den aktuella arbetskatalogen absolut sökväg, så att länken skapas med ett absolut mål.

Kommentarer

  • " … hjälper till att föreställa sig att den skapade symlänken helt enkelt innehåller text …. " Isn ' är detta inte den bokstavliga sanningen?
  • Det är det. Jag skulle kanske kunna ändra föreställa mig till " vet " eller " förstå ".
  • Kanske har jag blivit förvirrad (igen). Det verkar där du säger " mål " du menar " källa ". Argumentet source_file (första) är där länken pekar, vilket är ordligt vad du anger i kommandot. Argumentet target_file (andra) blir namnet på länken såvida inte det du anger är en katalog, i vilket fall länknamnet är detsamma som basnamnet på source_file men placerad i katalogen target_file.
  • Y̶o̶u̶ ' ̶r̶e̶ ̶r̶i̶g̶h̶t̶, ' S ett fel i den ̶a̶n̶s̶w̶e̶r̶.̶ galet hur den didn ' T fastna ̶s̶o̶o̶n̶e̶r̶.̶ ̶F̶i̶x̶i̶n̶g̶.̶ Nej, var svaret rätt. Av ln manpage är target det första argumentet (där länken pekar till ) medan det andra argumentet kallas helt enkelt link (source nämns inte).
  • I linux (gnu ln) mansidan anropar det första argumentet target och det andra link ( man7.org/ linux / man-pages / man1 / ln.1.html ). Men i BSD (inklusive OS X) kallas den första source och den andra target ( freebsd.org/cgi/man.cgi?ln ). Ganska förvirrande.

Svar

Med -r (--relative) flagga kommer att fungera:

ln -sr foo ~/bin/foo_link 

Kommentarer

  • Var uppmärksam på att -r är en GNUism, dvs icke POSIX så vann ' t i OP-fallet som standard OS X ln kommandot är BSD-baserat.

Svar

För att spara lite att skriva kan du göra

ln -s "$PWD"/foo ~/bin/foo_link 

Kommentarer

  • @Freddy, det beror på skalet. I fisk eller zsh skulle det vara OK.I Bourne-liknande skal inklusive bash och med standardvärdet $ IFS skulle SPC verkligen vara ett problem, men också TAB, NL och alla globtecken (minst *, ? och [...]).
  • @St é phaneChazelas Ja, du ' är rätt och frågan är taggad med bash, så det ' är i allmänhet en bra idé att citera det. Min dåliga, jag borde ha varit mer specifik.

Svar

Vad sägs om:

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

Kommentarer

  • Nej, gör inte ' t tricket.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *