Jeg prøver at skabe en masse symbolske links, men jeg kan ikke finde ud af hvorfor dette fungerer
ln -s /Users/niels/something/foo ~/bin/foo_link
mens dette
cd /Users/niels/something ln -s foo ~/bin/foo_link
ikke er det.
Jeg tror, det har noget at gøre med foo_link
at linke til foo i /Users/niels/bin
i stedet for /Users/niels/something
Så spørgsmålet er, hvordan opretter jeg et symbolsk link, der peger på en absolut sti uden faktisk at skrive det?
Til reference bruger jeg Mac OS X 10.9 og Zsh .
Svar
Den nemmeste måde at linke til den aktuelle mappe som en absolut sti uden at skrive hele stistrengen ville være
ln -s "$(pwd)/foo" ~/bin/foo_link
target
(første) argument for ln -s
kommandoen fungerer i forhold til det symbolske links placering, ikke din nuværende mappe. Det hjælper med at vide, at i det væsentlige skaberen ed symlink (det andet argument) holder simpelthen teksten du giver til det første argument.
Derfor, hvis du gør følgende:
cd some_directory ln -s foo foo_link
og flyt derefter linket rundt
mv foo_link ../some_other_directory ls -l ../some_other_directory
du vil se, at foo_link
forsøger at pege på foo
i det bibliotek, det er bosat i. Dette fungerer også med symbolske links, der peger på relative stier. Hvis du gør følgende:
ln -s ../foo yet_another_link
og derefter flytte yet_another_link
til en anden mappe og kontrollere, hvor den peger på, du vil se, at det altid peger på ../foo
. Dette er den tilsigtede adfærd, da symbolske links mange gange kan være en del af en katalogstruktur, der kan opholde sig i forskellige absolutte stier.
I dit tilfælde, når du opretter linket ved at skrive
ln -s foo ~/bin/foo_link
foo_link
holder bare en link til foo
i forhold til dets placering. At sætte $(pwd)
foran målargumentets navn tilføjer simpelthen den aktuelle arbejdsmappe “s absolut sti, så linket oprettes med et absolut mål.
Kommentarer
Svar
Brug af -r
(--relative
) flag får dette til at fungere:
ln -sr foo ~/bin/foo_link
Kommentarer
- Pas på, at
-r
er en GNUisme, dvs. ikke POSIX, så vandt ' t i OP-sagen som standard OS Xln
kommandoen er BSD-baseret.
Svar
For at gemme nogle ved at skrive kan du gøre
ln -s "$PWD"/foo ~/bin/foo_link
Kommentarer
- @Freddy, det afhænger af skallen. I fisk eller zsh ville det være OK.I Bourne-lignende skaller inklusive bash og med standardværdien på $ IFS ville SPC faktisk være et problem, men også TAB, NL og alle klodrende tegn (mindst
*
,?
og[...]
). - @St é phaneChazelas Ja, du ' er rigtigt, og spørgsmålet er tagget med
bash
, så det ' er generelt en god idé at citere det. Min dårlige, jeg burde have været mere specifik.
Svar
Hvad med:
$ cd /Users/niels/something $ ln -s ./foo ~/bin/foo_link
Kommentarer
- Nej, gør ikke ' t tricket.
source_file
(første) argumentet er hvor linket peger, hvilket er ordret hvad du indtaster på kommandoen.target_file
(andet) argument bliver navnet på linket, medmindre det du indtaster er en mappe, i hvilket tilfælde linknavnet er det samme som basisnavnet påsource_file
men placeres i bibliotekettarget_file
.ln
manpage ertarget
det første argument (hvor linket peger til ), mens det andet argument kaldes simpelthenlink
(source
nævnes ikke).target
og det andetlink
( man7.org/ linux / man-pages / man1 / ln.1.html ). Men i BSD (inklusive OS X) kaldes den førstesource
og den andentarget
( freebsd.org/cgi/man.cgi?ln ). Ganske forvirrende.