Symlinking đến một thư mục cung cấp cho các kết quả khác nhau ls -l
tùy thuộc vào việc tôi ln -s dir
hoặc ln -s dir/
. Nhưng sự khác biệt thực sự là gì, và tôi nên chọn cái nào hơn tại sao?
Symlinking đến một thư mục cung cấp cho các kết quả khác nhau ls -l
tùy thuộc vào việc tôi ln -s dir
hoặc ln -s dir/
. Nhưng sự khác biệt thực sự là gì, và tôi nên chọn cái nào hơn tại sao?
Câu trả lời:
Không có sự khác biệt. (Sẽ có sự khác biệt nếu mục tiêu không phải là một thư mục hiện có.)
Dấu gạch chéo cuối cùng có thể đã kết thúc ở đó vì hoàn thành shell: với một số cấu hình, ln -s tar
TabSpacelink
hoàn thành ln -s target/ link
.
foo -> bar/
sau đó foo/qux
tương đương với bar//qux
. Trong khi tiêu đề của câu hỏi, chính thức nói, không bao gồm foo -> bar/
, tôi cũng thảo luận về trường hợp đó trong câu trả lời của tôi ở đó.
Điều duy nhất tôi có thể nghĩ là nó "bảo vệ" bạn khỏi việc ai đó xóa thư mục và tạo một tập tin.
[user@host linktest]$ mkdir test
[user@host linktest]$ ln -s test/ slash
[user@host linktest]$ ln -s test noslash
[user@host linktest]$ ls -l
total 4
lrwxrwxrwx 1 paul paul 4 Feb 21 21:00 noslash -> test
lrwxrwxrwx 1 paul paul 5 Feb 21 21:00 slash -> test/
drwxrwxr-x 2 paul paul 4096 Feb 21 20:59 test
[user@host linktest]$ file *slash
noslash: symbolic link to `test'
slash: symbolic link to `test/'
[user@host linktest]$ rmdir test
[user@host linktest]$ file *slash
noslash: broken symbolic link to `test'
slash: broken symbolic link to `test/'
[user@host linktest]$ touch test
[user@host linktest]$ file *slash
noslash: symbolic link to `test'
slash: broken symbolic link to `test/'
[user@host linktest]$
Phiên bản với dấu gạch chéo bị phá vỡ khi mục tiêu được thay thế bằng một tệp.
Câu hỏi xen kẽ. Tôi đã thực hiện một bài kiểm tra nhỏ:
$ mkdir dir
$ ln -s dir/ test_slash
$ ln -s dir test_noslash
$ ls -l
total 4
drwxr-xr-x 2 vrusinov vrusinov 4096 Feb 21 16:41 dir
lrwxrwxrwx 1 vrusinov vrusinov 3 Feb 21 16:41 test_noslash -> dir
lrwxrwxrwx 1 vrusinov vrusinov 4 Feb 21 16:41 test_slash -> dir/
$ strace ls test_slash 2> trace_slash
$ strace ls test_noslash 2> trace_noslash
$ wc -l trace_*
79 trace_noslash
79 trace_slash
$ diff -u trace_* | less
Như bạn có thể thấy, không có sự khác biệt về số lượng cuộc gọi hệ thống (ít nhất là đối với ls) và dấu vết trông rất giống nhau. Tuy nhiên, đây chỉ là thử nghiệm kết xuất và tôi không chắc chắn - có thể có một số khác biệt.
Câu hỏi của bạn thực sự là về hành vi của ls
chương trình.
1) Nếu bạn làm ls -l $dir
trong đó $ dir thực sự là một liên kết tượng trưng, bạn sẽ nhận được thông tin về liên kết tượng trưng.
2) Nếu bạn làm ls -lL $dir
trong đó $ dir là một liên kết tượng trưng đến một thư mục, bạn sẽ nhận được thông tin về thư mục đích.
3) Nếu bạn làm ls -l $dir/.
đó buộc symlink phải được theo dõi và cung cấp thông tin về thư mục đích.
4) Nếu bạn làm như vậy ls -l $dir/
, kết quả có thể giống như # 1 hoặc có thể giống với # 3 tùy thuộc vào phiên bản nào ls
đang được sử dụng. Tôi đã quen với một phiên bản cũ hơn của Solaris làm nó như # 1 và rất ngạc nhiên khi Linux làm nó như # 3.
và cái nào tôi nên thích tại sao?
Không có dấu gạch chéo nếu bạn có thể quan tâm liệu tên thư mục cho là thư mục thực tế so với liên kết tượng trưng đến thư mục.
Với dấu gạch chéo nếu bạn quan tâm nhiều hơn đến các tệp trong thư mục thay vì chính thư mục đó.