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 Xln
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.
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_file
men placerad i katalogentarget_file
.ln
manpage ärtarget
det första argumentet (där länken pekar till ) medan det andra argumentet kallas helt enkeltlink
(source
nämns inte).target
och det andralink
( man7.org/ linux / man-pages / man1 / ln.1.html ). Men i BSD (inklusive OS X) kallas den förstasource
och den andratarget
( freebsd.org/cgi/man.cgi?ln ). Ganska förvirrande.