Правильный способ сделать это - использовать эту -n, --no-dereference
опцию следующим образом.
$ ln -snf foo2 bar
Это приводит ln
к тому, что существующая символическая ссылка обрабатывается как файл. В противном случае, он разыменовывает bar
к foo1
, нисхожу в foo1
и использует оригинальное TARGET
имя, что LINK_NAME
и именно поэтому вы в конечном итоге с линком для foo2
создаваемых внутри foo1
каталога. На странице ln
руководства говорится следующее ...
-n, -no-разыменование
рассматривать LINK_NAME как обычный файл, если это символическая ссылка на
каталог
Ниже приведен вывод оболочки на моем рабочем столе Arch Linux с версией 8.21 ln
с --no-dereference
опцией и без нее , я получил те же результаты, что и вы, без --no-dereference
опции, но с --no-dereference
опцией она работала, как и ожидалось.
$ 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
?