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
-rer en GNUisme, dvs. ikke POSIX, så vandt ' t i OP-sagen som standard OS Xlnkommandoen 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_filemen placeres i bibliotekettarget_file.lnmanpage ertargetdet første argument (hvor linket peger til ), mens det andet argument kaldes simpelthenlink(sourcenævnes ikke).targetog det andetlink( man7.org/ linux / man-pages / man1 / ln.1.html ). Men i BSD (inklusive OS X) kaldes den førstesourceog den andentarget( freebsd.org/cgi/man.cgi?ln ). Ganske forvirrende.