ln -s met een pad relatief aan pwd

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

  • " … helpt om voor te stellen dat de aangemaakte symlink simpelweg tekst bevat … " Isn ' is dit de letterlijke waarheid?
  • Dat is het. Misschien kan ik stel me veranderen in " weten " of " begrijp ".
  • Misschien heb ik mezelf (weer) in de war gebracht. Het lijkt erop dat waar u " target " zegt, u " source . Het source_file (eerste) argument is waar de link naar verwijst, wat letterlijk is wat je op het commando invoert. Het target_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 de source_file maar geplaatst in de directory target_file.
  • Y̶o̶u̶ ̶r̶e̶̶ ̶ ̶ teh̶e̶r̶ ' s een fout in de ̶a̶n̶s̶w̶e̶r̶.̶ gek hoe het stoorden ' T gepakt ̶s̶o̶o̶n̶e̶r̶.̶ ̶F̶i̶x̶i̶n̶g̶.̶ Nee, was het antwoord Rechtsaf. Door de ln manpage, target is het eerste argument (waar de link naar verwijst) terwijl het tweede argument wordt eenvoudigweg de link genoemd (source wordt niet genoemd).
  • In linux (gnu ln) man-pagina roept het eerste argument target en het tweede link ( man7.org/ linux / man-pages / man1 / ln.1.html ). Maar in BSD (inclusief OS X) heet de eerste source en de tweede target ( freebsd.org/cgi/man.cgi?ln ). Best verwarrend.

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

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *