ln -s med en sti i forhold til pwd

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

  • " … hjælper med at forestille sig at det oprettede symlink simpelthen indeholder tekst …. " Isn ' t dette den bogstavelige sandhed?
  • Det er det. Måske kunne jeg ændre forestille mig til " know " eller " forstå ".
  • Måske har jeg forvirret mig (igen). Det ser ud til, hvor du siger " mål " du mener " kilde ". 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 biblioteket target_file.
  • Y̶o̶u̶ ' ̶r̶e̶ ̶r̶i̶g̶h̶t̶, ̶ ̶t̶r̶r̶ ' s en fejl i den ̶a̶n̶s̶w̶e̶r̶.̶ vanvittigt, hvordan det didn ' ikke blive fanget ̶s̶o̶o̶n̶e̶r̶.̶ ̶F̶i̶x̶i̶n̶g̶.̶ Nej, svaret var ret. Ved ln manpage er target det første argument (hvor linket peger til ), mens det andet argument kaldes simpelthen link (source nævnes ikke).
  • I linux (gnu ln) er mand side kalder det første argument target og det andet link ( man7.org/ linux / man-pages / man1 / ln.1.html ). Men i BSD (inklusive OS X) kaldes den første source og den anden target ( freebsd.org/cgi/man.cgi?ln ). Ganske forvirrende.

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 X ln 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.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *