Cách thích hợp để làm điều này là sử dụng --no-dereference tùy chọn như vậy.
$ ln -snf foo2 bar
Điều này gây ra ln để coi các liên kết tượng trưng hiện có như một tập tin. Nếu không, nó là hội nghị bar đến foo1, đi xuống foo1 và sử dụng bản gốc TARGET tên như LINK_NAME và đó là lý do tại sao bạn kết thúc với một liên kết tượng trưng đến foo2 được tạo ra bên trong foo1 danh mục. Trang web trên ln tuyên bố như sau ...
-n, --no-dereference
treat LINK_NAME as a normal file if it is a symbolic link to a
directory
Dưới đây là kết quả đầu ra trên màn hình Arch Linux của tôi với phiên bản 8.21 của ln có và không có --no-dereference tùy chọn, tôi đã nhận được kết quả giống như bạn đã làm mà không có --no-dereference tùy chọn, nhưng sử dụng tùy chọn --no-dereference tùy chọn nó hoạt động như mong đợi.
$ 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?