La forma correcta de hacer esto es usar la -n, --no-dereferenceopción de esta manera.
$ ln -snf foo2 bar
Esto hace lnque se trate el enlace simbólico existente como un archivo. De lo contrario, se elimina referencias bara foo1, desciende en foo1y utiliza el original TARGETnombre que el LINK_NAMEY es por eso que terminan con un enlace simbólico al foo2ser creado dentro del foo1directorio. La página de manual lnindica lo siguiente ...
-n, --no-dereference
trate LINK_NAME como un archivo normal si es un enlace simbólico a un
directorio
A continuación se muestra el resultado del shell en mi escritorio Arch Linux con la versión 8.21 de lncon y sin la --no-dereferenceopción, obtuve los mismos resultados que obtuviste sin la --no-dereferenceopción, pero usar la --no-dereferenceopción funcionó como se esperaba.
$ 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?