Ik “probeer een aantal symbolische links te maken, maar ik kan niet achterhalen waarom dit werkt
ln -s /Users/niels/something/foo ~/bin/foo_link
terwijl dit
cd /Users/niels/something ln -s foo ~/bin/foo_link
dat niet is.
Ik denk dat het iets te maken heeft met foo_link
linken naar foo in /Users/niels/bin
in plaats van /Users/niels/something
Dus de vraag is: hoe maak ik een symbolische link die naar een absoluut pad verwijst, zonder het echt te typen?
Ter referentie, ik gebruik Mac OS X 10.9 en Zsh .
Antwoord
De gemakkelijkste manier om naar de huidige directory te linken als een absoluut pad, zonder de hele padreeks te typen, zou zijn
ln -s "$(pwd)/foo" ~/bin/foo_link
Het target
(eerste) argument voor het ln -s
commando werkt relatief ten opzichte van de locatie van de symbolische link, niet je huidige directory. Het helpt om te weten dat in wezen de creat ed symlink (het tweede argument) bevat simpelweg de tekst die je opgeeft voor het eerste argument.
Daarom, als je het volgende doet:
cd some_directory ln -s foo foo_link
en verplaats die link vervolgens
mv foo_link ../some_other_directory ls -l ../some_other_directory
je zult zien dat foo_link
probeert te verwijzen naar foo
in de directory waarin het zich bevindt. Dit werkt ook met symbolische links die naar relatieve paden verwijzen. Als je het volgende doet:
ln -s ../foo yet_another_link
en verplaats yet_another_link
naar een andere map en controleer waar het naar verwijst, je zult zien dat het altijd verwijst naar ../foo
. Dit is het beoogde gedrag, aangezien symbolische links vaak deel kunnen uitmaken van een directorystructuur die zich in verschillende absolute paden kan bevinden.
In uw geval, wanneer u de link maakt door
ln -s foo ~/bin/foo_link
foo_link
te typen, link naar foo
, relatief ten opzichte van de locatie. Door $(pwd)
voor de naam van het doelargument te plaatsen, wordt de huidige werkmap toegevoegd absoluut pad, zodat de link wordt gemaakt met een absoluut doel.
Reacties
Antwoord
Met behulp van de -r
(--relative
) vlag zal dit laten werken:
ln -sr foo ~/bin/foo_link
Reacties
- Pas op dat
-r
een GNUism is, dwz niet POSIX, dus ' niet zal werken in het OP-geval als het standaard OS Xln
commando is gebaseerd op BSD.
Antwoord
Om wat te bewaren typen, kunt u doen
ln -s "$PWD"/foo ~/bin/foo_link
Reacties
- @Freddy, het hangt af van de shell. In vis of zsh zou het goed zijn.In Bourne-achtige shells inclusief bash en met de standaardwaarde $ IFS, zou SPC inderdaad een probleem zijn, maar ook TAB, NL en alle globbing-tekens (tenminste
*
,?
en[...]
). - @St é phaneChazelas Ja, jij ' hebben gelijk en de vraag is getagd met
bash
, dus ' is over het algemeen een goed idee om het te citeren. Mijn fout, ik had specifieker moeten zijn.
Antwoord
Hoe zit het met:
$ cd /Users/niels/something $ ln -s ./foo ~/bin/foo_link
Reacties
- Nee, ' kan het niet.
source_file
(eerste) argument is waar de link naar verwijst, wat letterlijk is wat je op het commando invoert. Hettarget_file
(tweede) argument wordt de naam van de link, tenzij wat je invoert een directory is, in welk geval de linknaam hetzelfde is als de basisnaam van desource_file
maar geplaatst in de directorytarget_file
.ln
manpage,target
is het eerste argument (waar de link naar verwijst) terwijl het tweede argument wordt eenvoudigweg delink
genoemd (source
wordt niet genoemd).target
en het tweedelink
( man7.org/ linux / man-pages / man1 / ln.1.html ). Maar in BSD (inclusief OS X) heet de eerstesource
en de tweedetarget
( freebsd.org/cgi/man.cgi?ln ). Best verwarrend.