A maneira correta de fazer isso é usar a -n, --no-dereferenceopção assim.
$ ln -snf foo2 bar
Isso faz lncom que o link simbólico existente seja tratado como um arquivo. Caso contrário, ele dereferences barpara foo1, desce em foo1e usa o original TARGETnome como o LINK_NAMEE é por isso que você acabar com um link simbólico para foo2ser criado dentro do foo1diretório. A página de manual lndeclara 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 lncom e sem a --no-dereferenceopção, obtive os mesmos resultados que você obteve sem a --no-dereferenceopção, mas usando a --no-dereferenceopçã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?