Là mục tiêu của symlink có liên quan đến thư mục mẹ của đích và nếu vậy, tại sao?


14

Tôi đã có cấu trúc tệp sau:

build/
client/
  –> index.js

Và khi tôi cố gắng tạo một liên kết tượng trưng có tên là "client" bên trong thư mục build đề cập đến thư mục client trong cwd như vậy

// Fails
$ pwd
/home/user/
$ ln -s client build/client 
$ stat build/client/index.js
stat: build/client/index.js: stat: Too many levels of symbolic links

Tôi nhận được lỗi ELOOP hiển thị ở trên. Khi tôi thay đổi đường dẫn đích thành tương đối với đường dẫn đích, tất cả đều tốt:

// Works
$ pwd
/home/user/
$ ln -s ../client build/client 
$ stat build/client/index.js
stat: <outputs file stats>

Đây có phải là hành vi dự định và xin vui lòng giải thích tại sao ...


điều này có lẽ có liên quan đến việc sử dụng ../ sử dụng đường dẫn tuyệt đối để khai báo đường dẫn thay vì đường dẫn tương đối. một điều tốt là luôn luôn sử dụng đường dẫn tuyệt đối
Kiwy

Tôi đồng ý với cách thực hành tốt nhất vì tôi luôn sử dụng các đường dẫn tuyệt đối cho cả mục tiêu và đích đến. Tuy nhiên, các trang man nói rằng các đường dẫn tương đối có thể được sử dụng cho cả ...
jibsales 17/12/13

Câu trả lời:


13

Đối với một cái không hoạt động, nếu chúng ta nhìn vào ls -lkết quả, chúng ta sẽ nhận được những điều sau đây:

[sparticvs@sparta test]$ ls -l build/
total 0
lrwxrwxrwx. 1 sparticvs sparticvs 6 Dec 17 16:08 client -> client

Bây giờ để hiểu những gì đang xảy ra ở đây. Hãy nhìn vào lệnh bạn đã gọi:

ln -s client build/client

Theo Man Page, có hai kết quả phù hợp với định dạng này

SYNOPSIS
       ln [OPTION]... [-T] TARGET LINK_NAME   (1st form)
       ln [OPTION]... TARGET... DIRECTORY     (3rd form)

Nó sẽ phù hợp trên mẫu đầu tiên (kể từ lần đầu tiên). Bây giờ, "tên đích" hoặc clienttrong trường hợp của bạn, có thể là (theo lnhướng dẫn hoàn chỉnh ) các chuỗi tùy ý. Họ không phải giải quyết bất cứ điều gì ngay bây giờ, nhưng có thể giải quyết vấn đề nào đó trong tương lai. Những gì bạn đang tạo với lời mời của bạn là một "liên kết tượng trưng" và hệ thống không ngăn bạn tạo ra những thứ này.

Bây giờ lời mời thứ hai của bạn ln -s ../client build/clientlà cái được gọi là "liên kết tương đối" (như bạn đã lưu ý trong bài đăng của riêng bạn). Có một loại thứ hai và đó là một "liên kết tượng trưng tuyệt đối" sẽ được gọi bằng cách thực hiện ln -s /home/user/client build/client.

Đây không phải là một lỗi. Theo hướng dẫn, nó nêu:

Khi tạo một liên kết tượng trưng tương đối ở một vị trí khác với thư mục hiện tại, độ phân giải của liên kết tượng trưng sẽ khác với độ phân giải của cùng một chuỗi từ thư mục hiện tại. Do đó, nhiều người dùng trước tiên muốn thay đổi thư mục thành vị trí nơi tạo liên kết tương đối, do đó, việc hoàn thành tab hoặc độ phân giải tệp khác sẽ tìm thấy cùng một mục tiêu như những gì sẽ được đặt trong liên kết tượng trưng.

-- từ info coreutils 'ln invocation'

Điều đó nói rằng, bạn PHẢI sử dụng đường dẫn tương đối hoặc tuyệt đối đến mục tiêu.


5

Đây thực sự là hành vi dự định. Từ ln(1)trang người đàn ông:

Liên kết tượng trưng có thể giữ văn bản tùy ý; nếu sau đó được giải quyết, một liên kết tương đối được diễn giải liên quan đến thư mục mẹ của nó.

Về lý do tại sao, hãy tưởng tượng nếu liên kết tượng trưng thay vì được giải thích liên quan đến nguồn của nó hơn là đích của nó. Khi giải quyết nó sau này, bạn sẽ cần biết CWD của bạn là gì khi bạn tạo ra nó, điều này là vô nghĩa, chứ đừng nói là không thể.

Hơn nữa, bằng cách này bạn có được một phương thức gọn gàng và nhỏ gọn để tạo cấu trúc thư mục bộ xương mà bạn có thể thả bất cứ nơi nào trong cây thư mục mà không phá vỡ các liên kết tượng trưng.

Để cho bạn một ví dụ về ý tôi muốn nói, giả sử bạn đang làm việc trên một dự án và bạn có toàn bộ cấu trúc thư mục được thiết lập cho nó như vậy:

$ ls -1 /home/you/project
thingummies/
widgets/
wizardry/

Bây giờ giả sử bạn muốn tạo một liên kết tượng trưng vào widgets/bên trong wizardry/. Bạn có hai lựa chọn:

$ ln -s /home/you/project/widgets /home/you/project/wizardry

hoặc là

$ ln -s ../widgets /home/you/project/wizardry

Nếu sau đó bạn thử di chuyển /home/you/projectbất cứ nơi nào khác, một liên kết tượng trưng được tạo bằng biểu mẫu đầu tiên sẽ bị hỏng vì nó đang tìm kiếm /home/you/project/widgets. Biểu mẫu thứ hai sẽ giữ chức năng liên kết tượng trưng vì nó tìm kiếm ../widgets liên quan đến địa điểm, bất kể vị trí đó có thể ở đâu trong cây thư mục.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.