Câu trả lời:
Một liên kết tượng trưng thực sự lưu trữ đường dẫn bạn đưa ra theo nghĩa đen, dưới dạng một chuỗi¹. Điều đó có nghĩa là liên kết của bạn ~/mylink
chứa " .
" (một ký tự). Khi bạn truy cập vào liên kết, đường dẫn đó được diễn giải liên quan đến vị trí của liên kết, thay vì nơi bạn ở khi bạn tạo liên kết.
Thay vào đó, bạn có thể lưu trữ đường dẫn thực tế bạn muốn trong liên kết:
ln -s "$(pwd)" ~/mylink
sử dụng thay thế lệnh để đặt đầu ra của pwd
(tên thư mục làm việc) vào dòng lệnh của bạn. ln
nhìn thấy đường dẫn đầy đủ và lưu nó vào liên kết tượng trưng của bạn, sau đó sẽ trỏ đến đúng nơi.
¹ Nhiều hơn hoặc ít hơn.
Bạn nên sử dụng:
ln -s "$(cd . && pwd)" ~/mylink
hoặc là:
ln -s "$(pwd -P)" ~/mylink
để có được kết quả đúng cho thư mục làm việc hiện tại. Nó có thể được thay đổi trong khi bạn đang làm việc trong nó như trong câu hỏi này .
$PWD
(đường dẫn anh ta đã sử dụng để đến đó), chứ không phải $(pwd -P)
(đường dẫn chính tắc đến thư mục hiện tại). Nếu $PWD
không còn trỏ đến thư mục hiện tại, thì cũng không có gì để nói $(pwd -P)
trong một phút tiếp theo.
"$PWD"
vẫn có giá trị cũ nếu direcory hiện tại bị di chuyển. PWD
chỉ được đặt khi bạn cd
hoặc khởi tạo bởi trình bao.
cd
không được đảm bảo để thực hiện $ PWD hoặc đầu ra của pwd một đường dẫn đến thư mục hiện tại. Bạn đang cố gắng bảo vệ chống lại điều gì đó không có khả năng xảy ra, nhưng trong giải pháp đầu tiên, điều đó không nhất thiết phải hiệu quả và trong lần thứ hai, đó là thay đổi hành vi.
mv
sau khi bạn làm ln
, thì bạn sẽ rơi vào tình huống tương tự. Mặt khác, nếu anh ta làm vậy cd /long/logical/path/to/some/directory
, bạn không muốn liên kết trỏ đến /vg0/lv1/user2/app4
(đường dẫn chính tắc) vì liên kết sẽ trỏ đến vị trí sai khi /long/logical/path/to/some/directory
trỏ đến một nơi khác.
"$PWD"
trong vỏ POSIX và~0
trongzsh
.