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
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 Xln
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.
source_file
(første) argumentet er hvor lenken peker, som er ordrett hva du skriver inn på kommandoen. Argumentettarget_file
(andre) blir navnet på lenken, med mindre det du skriver inn er en katalog, i hvilket tilfelle koblingsnavnet er det samme som grunnnavnet tilsource_file
men plassert i katalogentarget_file
.ln
manpage ertarget
det første argumentet (der lenken peker til ), mens det andre argumentet blir ganske enkelt referert til somlink
(source
er ikke nevnt).target
og det andrelink
( man7.org/ linux / man-pages / man1 / ln.1.html ). Men i BSD (inkludert OS X) kalles den førstesource
og den andretarget
( freebsd.org/cgi/man.cgi?ln ). Ganske forvirrende.