Jak Dubu zdůrazňuje v komentáři, problém spočívá ve vašich relativních cestách. Měl jsem podobný problém se symbolickým propojením konfigurace nginx z /usr/local/etc/nginx
až /etc/nginx
. Pokud svůj symbolický odkaz vytvoříte takto:
cd /usr/local/etc
ln -s nginx/ /etc/nginx
Ve skutečnosti vytvoříte odkaz /etc/nginx -> /etc/nginx, protože zdrojová cesta je relativní k cestě odkazu. Řešení je stejně jednoduché jako použití absolutních cest:
ln -s /usr/local/etc/nginx /etc/nginx
Pokud chcete použít relativní cesty a nechat je chovat se tak, jak pravděpodobně očekáváte, můžete použít pwd
pro vložení aktuální cesty k pracovnímu adresáři, například takto:
cd /usr/local/etc
ln -s "$(pwd)/nginx/" /etc/nginx
Budete chtít mít kolem cesty uvozovky, abyste se ujistili, že věci, jako jsou mezery ve vaší aktuální cestě, jsou escapovány. Pamatujte, že při tom musíte použít dvojité uvozovky, jako $(pwd)
nebude nahrazeno, pokud použijete jednoduché uvozovky.
Na první pohled, to, co jste navrhli, pro mě funguje.
Příklad
$ mkdir -p test/src test/firefox
$ tree --noreport -fp
.
`-- [drwxrwxr-x] ./test
|-- [drwxrwxr-x] ./test/firefox
`-- [drwxrwxr-x] ./test/src
Vytvořte symbolický odkaz:
$ ln -s test/src test/firefox
$ tree --noreport -fp
.
`-- [drwxrwxr-x] ./test
|-- [drwxrwxr-x] ./test/firefox
| `-- [lrwxrwxrwx] ./test/firefox/src -> test/src
`-- [drwxrwxr-x] ./test/src
Spuštění podruhé by obvykle způsobilo toto:
$ ln -s test/src test/firefox
ln: failed to create symbolic link ‘test/firefox/src’: File exists
Takže se tu pravděpodobně děje něco jiného. Měl bych podezření, že máte kruhový odkaz, kde odkaz směřuje zpět na sebe.
Můžete použít find
abych to trochu vypátral:
$ cd /suspected/directory
$ find -L ./ -mindepth 15
Symbolické odkazy jsou relativní k nadřazenému adresáři odkazu, nikoli k aktuálnímu adresáři ln
proces.
Když to uděláte:
cd /top/dir
ln -s test/src test/firefox
(kde test/firefox
je adresář), vytváříte test/firefox/src
symbolický odkaz, jehož cíl je test/src
.
To test/src
je relativní k test/firefox
adresář, takže je to symbolický odkaz na /top/dir/test/firefox/test/src
.
Pokud chcete, aby tento symbolický odkaz byl odkazem na /top/dir/test/src
, musíte napsat:
ln -s ../src test/firefox/
Nebo
ln -s /top/dir/test/src test/firefox/
i když je obecně špatný nápad vytvářet symbolické odkazy na absolutní cesty, protože je lze snadno prolomit při přejmenování adresářů nebo připojení souborových systémů jinam.
S GNU ln
, můžete použít jeho -r
možnost nechat jej provést výpočet sám:
$ ln -rs test/src test/firefox/
$ ls -ld test/firefox/src
lrwxrwxrwx 1 chazelas chazelas 6 Nov 29 15:59 test/firefox/src -> ../src