Cách xác minh mục tiêu của một liên kết tượng trưng hướng đến một đường dẫn cụ thể


16

Trong tập lệnh bash, tôi biết tôi có thể kiểm tra xem một tập tin có phải là một liên kết tượng trưng với cú pháp sau không

if [ -L $path ]

Có ai biết làm thế nào tôi sẽ kiểm tra nếu đường dẫn đó được liên kết với một đường dẫn cụ thể không? Ví dụ, tôi muốn kiểm tra xem mục tiêu của $path/some/where.



2
Bạn có nghĩa là liên quan đến bằng một con đường cụ thể không? Bạn không thể làm một readlinkcon đường đã biết và so sánh nó với con đường bạn đang thử nghiệm?
Bratchley

@Bratchley. Vâng, đó là những gì tôi muốn nói .. cảm ơn vì câu trả lời.
Billman

2
Tôi đặc biệt khuyên bạn luôn đặt các biến shell trong dấu ngoặc kép (ví dụ if [ -L "$path" ]:) trừ khi bạn có lý do chính đáng để không và bạn chắc chắn rằng bạn biết bạn đang làm gì.
G-Man nói 'Phục hồi Monica'

@ G-Man cảm ơn vì những phản hồi tuyệt vời .. trong tiềm thức tôi biết để làm điều đó, nhưng quên nó trong thực tế .. sự củng cố giúp.
Billman

Câu trả lời:


22

Nếu bạn muốn kiểm tra xem $pathmột liên kết tượng trưng có mục tiêu là gì /some/where, bạn có thể sử dụng readlinktiện ích. Nó không phải là POSIX, nhưng nó có sẵn trên nhiều hệ thống (GNU / Linux, BusyBox, * BSD, khắc).

if [ "$(readlink -- "$path")" = /some/where ]; then 

Lưu ý rằng đây là một so sánh văn bản chính xác. Nếu mục tiêu của liên kết là /some//where, hoặc nếu nó wherevà giá trị của $path/some/link, sau đó các văn bản sẽ không phù hợp.

Nhiều phiên bản readlinkhỗ trợ tùy chọn -f, hợp thức hóa đường dẫn bằng cách mở rộng tất cả các liên kết tượng trưng.

Nhiều shell, bao gồm dash, ksh, bash và zsh, hỗ trợ -ef toán tử trong phần testdựng sẵn để kiểm tra xem hai tệp có giống nhau không (liên kết cứng đến cùng một tệp, sau khi theo các liên kết tượng trưng). Tính năng này cũng được hỗ trợ rộng rãi nhưng không phải POSIX.

if [ "$path" -ef "/some/where" ]; then 

ví dụ đầu tiên không hoạt động khi liên kết trỏ đến một đường dẫn tương đối ...
inemanja

@inemanja Chắc chắn là có. Nhưng như tôi nói, đây là một so sánh văn bản . Nó đối xử với các đường dẫn khác nhau đến cùng một mục tiêu là khác nhau. Nếu bạn muốn kiểm tra xem mục tiêu của liên kết tượng trưng có phải là một tệp cụ thể không, thay vì một đường dẫn cụ thể , hãy sử dụng một trong các phương pháp tôi mô tả bên dưới.
Gilles 'SO- ngừng trở nên xấu xa'

0

Để tránh các vấn đề với đường dẫn tương đối và tuyệt đối và "/" ở cuối đường dẫn hoặc liên kết:

if [ "$(realpath $(readlink -- "$path"))" = $(realpath /some/where) ]; then
    echo "Is"
else 
    echo "Is not"
fi

readlinkdường như không cần thiết, realpathsẽ tự động giải quyết liên kết tượng trưng.
Dagang
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.