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
-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.
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_file
ale umístěné v adresářitarget_file
.ln
jetarget
první argument (kde odkaz odkazuje na ), zatímco druhý argument se jednoduše označuje jakolink
(source
není zmíněn).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í.