A maneira correta de fazer isso é usar a -n, --no-dereference
opção assim.
$ ln -snf foo2 bar
Isso faz ln
com que o link simbólico existente seja tratado como um arquivo. Caso contrário, ele dereferences bar
para foo1
, desce em foo1
e usa o original TARGET
nome como o LINK_NAME
E é por isso que você acabar com um link simbólico para foo2
ser criado dentro do foo1
diretório. A página de manual ln
declara o seguinte ...
-n, - sem desreferencia
trate LINK_NAME como um arquivo normal se for um link simbólico para um
diretório
Abaixo está a saída do shell no meu desktop Arch Linux com a versão 8.21 de ln
com e sem a --no-dereference
opção, obtive os mesmos resultados que você obteve sem a --no-dereference
opção, mas usando a --no-dereference
opção funcionou conforme o esperado.
$ mkdir foo1 foo2
$ ln -s foo1 bar
$ ls -l bar
lrwxrwxrwx 1 drew users 4 Sep 17 12:51 bar -> foo1
$ ln -sf foo2 bar
$ ls -l bar
lrwxrwxrwx 1 drew users 4 Sep 17 12:51 bar -> foo1
$ ls -l foo1
total 0
lrwxrwxrwx 1 drew users 4 Sep 17 12:51 foo2 -> foo2
$ ln -snf foo2 bar
$ ls -l bar
lrwxrwxrwx 1 drew users 4 Sep 17 12:52 bar -> foo2
ln --version
?