Come sottolinea Dubu in un commento, il problema sta nei tuoi percorsi relativi. Ho avuto un problema simile con il collegamento simbolico della mia configurazione nginx da /usr/local/etc/nginx
a /etc/nginx
. Se crei il tuo collegamento simbolico in questo modo:
cd /usr/local/etc
ln -s nginx/ /etc/nginx
Realizzerai infatti il collegamento /etc/nginx -> /etc/nginx, perché il percorso di origine è relativo al percorso del collegamento. La soluzione è semplice come usare percorsi assoluti:
ln -s /usr/local/etc/nginx /etc/nginx
Se vuoi usare percorsi relativi e farli comportare come probabilmente ti aspetti, puoi usare pwd
per inserire il percorso della directory di lavoro corrente, in questo modo:
cd /usr/local/etc
ln -s "$(pwd)/nginx/" /etc/nginx
Vorresti avere le virgolette attorno al percorso, per assicurarti che cose come gli spazi nel tuo percorso attuale siano sfuggiti. Nota che devi usare le virgolette quando lo fai, come $(pwd)
non verrà sostituito se utilizzi virgolette singole.
In superficie, quello che hai suggerito di aver provato funziona per me.
Esempio
$ mkdir -p test/src test/firefox
$ tree --noreport -fp
.
`-- [drwxrwxr-x] ./test
|-- [drwxrwxr-x] ./test/firefox
`-- [drwxrwxr-x] ./test/src
Crea il link simbolico:
$ 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
Eseguendolo una seconda volta normalmente si ottiene questo:
$ ln -s test/src test/firefox
ln: failed to create symbolic link ‘test/firefox/src’: File exists
Quindi probabilmente hai qualcos'altro da fare qui. Sospetto che tu abbia un riferimento circolare in cui un collegamento punta a se stesso.
Puoi usare find
per indagare un po' su questo:
$ cd /suspected/directory
$ find -L ./ -mindepth 15
I collegamenti simbolici sono relativi alla directory principale del collegamento, non alla directory corrente del ln
processo.
Quando lo fai:
cd /top/dir
ln -s test/src test/firefox
(dove test/firefox
è una directory), stai creando un test/firefox/src
link simbolico il cui obiettivo è test/src
.
Quel test/src
è relativo al test/firefox
directory, quindi è un collegamento simbolico a /top/dir/test/firefox/test/src
.
Se volevi che quel collegamento simbolico fosse un collegamento a /top/dir/test/src
, dovresti scrivere:
ln -s ../src test/firefox/
Oppure
ln -s /top/dir/test/src test/firefox/
anche se in genere è una cattiva idea creare collegamenti simbolici a percorsi assoluti poiché vengono facilmente interrotti quando le directory vengono rinominate o i filesystem vengono montati altrove.
Con GNU ln
, puoi utilizzare il suo -r
opzione per lasciare che faccia il calcolo da solo:
$ ln -rs test/src test/firefox/
$ ls -ld test/firefox/src
lrwxrwxrwx 1 chazelas chazelas 6 Nov 29 15:59 test/firefox/src -> ../src