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
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 Xlnkommandot ä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.
source_file(första) är där länken pekar, vilket är ordligt vad du anger i kommandot. Argumentettarget_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_filemen placerad i katalogentarget_file.lnmanpage ärtargetdet första argumentet (där länken pekar till ) medan det andra argumentet kallas helt enkeltlink(sourcenämns inte).targetoch det andralink( man7.org/ linux / man-pages / man1 / ln.1.html ). Men i BSD (inklusive OS X) kallas den förstasourceoch den andratarget( freebsd.org/cgi/man.cgi?ln ). Ganska förvirrande.