ln -s s cestou relativní k pwd

Snažím se vytvořit spoustu symbolických odkazů, ale nemohu přijít na to, proč to funguje

ln -s /Users/niels/something/foo ~/bin/foo_link 

zatímco toto

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

není.

Věřím, že to má něco společného s foo_link odkazem na foo v /Users/niels/bin namísto /Users/niels/something

Takže otázka zní, jak vytvořím symbolický odkaz, který ukazuje na absolutní cestu, aniž bych ji skutečně psal?

Pro referenci používám Mac OS X 10.9 a Zsh .

Odpověď

Nejjednodušší způsob, jak propojit aktuální adresář jako absolutní cestu, aniž byste zadali celý řetězec cesty, by byl

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

target (první) argument pro ln -s příkaz funguje relativně k umístění symbolického odkazu, nikoli k vašemu aktuálnímu adresáři. Pomůže vám vědět, že v podstatě je to kreativa ed symlink (druhý argument) jednoduše obsahuje text , který zadáte pro první argument.

Proto, pokud provedete následující:

cd some_directory ln -s foo foo_link 

a poté tento odkaz přesuňte

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

uvidíte, že foo_link pokusí se ukázat na foo v adresáři, ve kterém sídlí. Funguje to také se symbolickými odkazy směřujícími na relativní cesty. Pokud uděláte následující:

ln -s ../foo yet_another_link 

a poté přesuňte yet_another_link do jiného adresáře a zkontrolujte, kam směřuje, uvidíte, že to vždy ukazuje na ../foo. Toto je zamýšlené chování, protože mnohokrát mohou být symbolické odkazy součástí struktury adresáře, která může být umístěna v různých absolutních cestách.

Ve vašem případě, když vytvoříte odkaz zadáním

ln -s foo ~/bin/foo_link 

foo_link pouze obsahuje odkaz na foo vzhledem k jeho umístění. Umístěním $(pwd) před název cílového argumentu jednoduše přidáte aktuální pracovní adresář absolutní cesta, takže odkaz je vytvořen s absolutním cílem.

Komentáře

  • " … pomáhá si představit , že vytvořený symbolický odkaz jednoduše obsahuje text …. " není ' Toto je doslovná pravda?
  • Je. Možná bych mohl představit změnit na " vědět " nebo " understand ".
  • Možná jsem se znovu zmátl. Zdá se, že kde říkáte " cíl " máte na mysli " zdroj ". Argument source_file (první) je místo, kde odkaz odkazuje, což je doslovné, co zadáte do příkazu. Argument target_file (druhý) se stane názvem odkazu, pokud zadaný adresář není, v takovém případě je název odkazu stejný jako základní název source_file ale umístěné v adresáři target_file.
  • Y̶o̶u̶ ' ̶r̶e̶ ̶r̶i̶g̶h̶t̶, ̶ ̶t̶h̶e̶r̶e ' s chybou ve ̶a̶n̶s̶w̶e̶r̶.̶ blázen, jak to Nechtěl ' t uvíznou ̶s̶o̶o̶n̶e̶r̶.̶ ̶F̶i̶x̶i̶n̶g̶.̶ No, odpověď zněla že jo. Na stránce ln je target první argument (kde odkaz odkazuje na ), zatímco druhý argument se jednoduše označuje jako link (source není zmíněn).
  • V linuxu (gnu ln) manuálová stránka volá první argument target a druhý link ( man7.org/ linux / man-pages / man1 / ln.1.html ). Ale v BSD (včetně OS X) se první nazývá source a druhý target ( freebsd.org/cgi/man.cgi?ln ). Docela matoucí.

Odpověď

Použití -r (--relative) to bude fungovat:

ln -sr foo ~/bin/foo_link 

Komentáře

  • Mějte na paměti, že -r je GNUism, tj. jiný než POSIX, takže v případě OP nebude fungovat jako standardní OS X < „79e00d9600″>

div id = „8dceb49c5b“>

příkaz je založen na BSD.

Odpověď

Uložení některých psaní, můžete

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

Komentáře

  • @Freddy, záleží na prostředí. V rybách nebo zsh by to bylo v pořádku.Ve skořápkách podobných Bourne, včetně bash, a s výchozí hodnotou $ IFS, by SPC skutečně byl problém, ale také TAB, NL a všechny globující znaky (alespoň *, ? a [...]).
  • @St é phaneChazelas Ano, vy ' máte pravdu a otázka je označena bash, takže ' je obecně dobrý nápad to citovat. Škoda, měl jsem být konkrétnější.

Odpověď

Co takhle:

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

Komentáře

  • Ne, nedělá to ' trik.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *