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
Odpověď
Použití -r (--relative) to bude fungovat:
ln -sr foo ~/bin/foo_link
Komentáře
- Mějte na paměti, že
-rje 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.
source_file(první) je místo, kde odkaz odkazuje, což je doslovné, co zadáte do příkazu. Argumenttarget_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ázevsource_fileale umístěné v adresářitarget_file.lnjetargetprvní argument (kde odkaz odkazuje na ), zatímco druhý argument se jednoduše označuje jakolink(sourcenení zmíněn).targeta druhýlink( man7.org/ linux / man-pages / man1 / ln.1.html ). Ale v BSD (včetně OS X) se první nazývásourcea druhýtarget( freebsd.org/cgi/man.cgi?ln ). Docela matoucí.