ln -s med en sti i forhold til pwd (Norsk)

Jeg prøver å lage en haug med symbolske lenker, men jeg kan ikke finne ut 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 noe å gjøre med at foo_link kobler til foo i /Users/niels/bin i stedet for /Users/niels/something

Så spørsmålet er, hvordan lager jeg en symbolsk lenke som peker på en absolutt bane, uten å faktisk skrive den?

Som referanse bruker jeg Mac OS X 10.9 og Zsh .

Svar

Den enkleste måten å koble til den aktuelle katalogen som en absolutt bane, uten å skrive hele banestrengen, ville være

ln -s "$(pwd)/foo" ~/bin/foo_link 

target (første) argument for ln -s kommandoen fungerer i forhold til den symbolske koblingen, ikke din nåværende katalog. Det hjelper å vite at, egentlig, skaperen ed symlink (det andre argumentet) holder ganske enkelt teksten du oppgir for det første argumentet.

Derfor, hvis du gjør følgende:

cd some_directory ln -s foo foo_link 

og flytt deretter lenken rundt

mv foo_link ../some_other_directory ls -l ../some_other_directory 

du vil se at foo_link prøver å peke på foo i katalogen den holder til i. Dette fungerer også med symbolske lenker som peker på relative stier. Hvis du gjør følgende:

ln -s ../foo yet_another_link 

og deretter flytte yet_another_link til en annen katalog og sjekk hvor den peker på, du vil se at det alltid peker til ../foo. Dette er den tiltenkte oppførselen, siden symbolske lenker ofte kan være en del av en katalogstruktur som kan ligge i forskjellige absolutte baner.

Når du oppretter lenken ved å skrive

ln -s foo ~/bin/foo_link 

foo_link, holder du bare lenke til foo, i forhold til plasseringen. Å sette $(pwd) foran målargumentets navn legger bare til den nåværende arbeidskatalogen absolutt sti, slik at lenken opprettes med et absolutt mål.

Kommentarer

  • " … hjelper deg med å forestille deg at den opprettede symlinken bare inneholder tekst …. " Isn ' t dette den bokstavelige sannheten?
  • Det er det. Kanskje jeg kunne endre forestille meg til " vet " eller " forstå ".
  • Kanskje jeg har fått meg selv forvirret (igjen). Det virker der du sier " mål " du mener " kilde ". source_file (første) argumentet er hvor lenken peker, som er ordrett hva du skriver inn på kommandoen. Argumentet target_file (andre) blir navnet på lenken, med mindre det du skriver inn er en katalog, i hvilket tilfelle koblingsnavnet er det samme som grunnnavnet til source_file men plassert i katalogen target_file.
  • Y̶o̶u̶ ' ̶r̶e̶r ' s en feil i ̶a̶n̶s̶w̶e̶r̶.̶ Crazy hvordan det gjorde ikke ' t bli fanget ̶s̶o̶o̶n̶e̶r̶.̶ ̶F̶i̶x̶i̶n̶g̶.̶ Nei, var svaret Ikke sant. Ved ln manpage er target det første argumentet (der lenken peker til ), mens det andre argumentet blir ganske enkelt referert til som link (source er ikke nevnt).
  • I linux (gnu ln) blir ikke man-siden kaller det første argumentet target og det andre link ( man7.org/ linux / man-pages / man1 / ln.1.html ). Men i BSD (inkludert OS X) kalles den første source og den andre target ( freebsd.org/cgi/man.cgi?ln ). Ganske forvirrende.

Svar

Bruk av -r (--relative) flagg vil få dette til å fungere:

ln -sr foo ~/bin/foo_link 

Kommentarer

  • Vær oppmerksom på at -r er en GNUisme, dvs. ikke POSIX, så vant ' t fungerer i OP-saken som standard OS X ln kommandoen er BSD-basert.

Svar

For å lagre noe å skrive, kan du gjøre

ln -s "$PWD"/foo ~/bin/foo_link 

Kommentarer

  • @Freddy, det kommer an på skallet. I fisk eller zsh ville det vært OK.I Bourne-lignende skjell inkludert bash og med standardverdien $ IFS, vil SPC virkelig være et problem, men også TAB, NL og alle globbing-tegn (minst *, ? og [...]).
  • @St é phaneChazelas Ja, du ' har rett, og spørsmålet er merket med bash, så det er ' generelt god idé å sitere det. Min dårlige, jeg burde vært mer spesifikk.

Svar

Hva med:

 $ cd /Users/niels/something $ ln -s ./foo ~/bin/foo_link 

Kommentarer

  • Nei, gjør ikke ' t tricket.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *