Hiểu các đường dẫn liên kết symlink và thư mục cha


9

Giả sử bạn có các thư mục /dir1/dir2/linked, trong đó cái sau là một liên kết tượng trưng cho cái trước.

Khi bạn cdđến linkedpwd, bạn nhận được đầu ra /dir2/linked. Nếu bạn sau đó cd .., bạn sẽ được đưa vào /dir2. Hành vi này phù hợp với khái niệm bạn đang ở /dir2/linkedtrước đây. Tuy nhiên, theo tôi hiểu, thư mục mẹ ( ..) của bất kỳ thư mục nào được lưu trữ trong thư mục inode (tức là: vật lý trong đĩa). Rõ ràng, vì /dir2/linkedthực sự /dir1, thư mục mẹ trên inode phải là/

Để làm phức tạp thêm vấn đề, trong khi bên trong /dir2/linked, đầu ra ls ..cd .. ; ls .khác nhau! Nó có vẻ như cdtôn vinh con đường liên kết, trong khi lstôn vinh con đường "vật lý". Như đã đề cập trong câu hỏi này , có cd -Pđối với trường hợp sử dụng này, mặc dù.

man pwd đề cập đến các thư mục làm việc "vật lý" và "hợp lý", nhưng tôi vẫn có một vài câu hỏi tại thời điểm này:

  • Là hành vi này luôn được cung cấp bởi các PWDbiến môi trường, như được đề cập trong man pwd?
  • Tại sao mặc định cdlscó các hành vi khác nhau, nếu cả hai đều là lệnh shell (nghĩa là: không phải chương trình)?
  • Liệu chương trình điển hình (không phải lệnh shell) sử dụng PWDthay cho đường dẫn vật lý? Tôi nhận ra rằng nó tùy thuộc vào việc thực hiện, nhưng có bất kỳ quy tắc nào không?

1
Rất nhiều thông tin trong câu trả lời này
Stéphane Chazelas

1
@ StéphaneChazelas Đó là một câu trả lời tuyệt vời, cảm ơn vì đã chia sẻ
goncalopp

Không có gì. Xin vui lòng sao chép-dán văn bản từ đó nếu bạn có kế hoạch để thực hiện câu trả lời của riêng bạn cho câu hỏi của riêng bạn.
Stéphane Chazelas

Câu trả lời:


5

bash "Biết" về liên kết tượng trưng và theo dõi thông tin này khi bạn sử dụng liên kết tượng trưng để vào thư mục.

Bạn có thể kiểm tra điều này bằng cách làm như sau trong ví dụ của bạn:

$ cd /dir2
$ cd linked
$ pwd
/dir2/linked
$ PWD='' bash -c pwd
/dir1

Bạn cần bắt đầu bash với một PWDbiến trống , nếu không, nó sử dụng thủ thuật đó để hiển thị đường dẫn "giả".

Lưu ý rằng đó ls một chương trình riêng biệt và như vậy không có kiến ​​thức của bash về cách bạn đến thư mục hiện tại, vì vậy ls ..sẽ chỉ hiển thị nội dung của thư mục mẹ thực sự , không liên quan đến liên kết tượng trưng mà bạn đã theo dõi.

Hầu hết các chương trình sẽ không phụ thuộc vào biến môi trường CWDvì có nhiều cách khởi động chương trình, thông qua bash shell chỉ là một cách nên không đáng tin cậy CWDđể chứa giá trị chính xác (hãy thử đặt CWDthành một cái gì đó sai trước khi thực hiện bash -c pwd, bạn có thể thấy nó kiểm tra giá trị cho sự tỉnh táo).


Thật hữu ích khi biết rằng bạn rõ ràng PWDnhư vậy, nhưng bản thân nó không trả lời các câu hỏi tôi đã đề cập
goncalopp

Đã thêm một số thông tin.
wurtel

Tôi đã có ấn tượng lsđược cung cấp bởi bash, nhưng bạn và helpđã thuyết phục tôi bằng cách khác. Điều đó làm cho mọi thứ rõ ràng hơn nhiều, cảm ơn!
goncalopp

PWDlà tiêu chuẩn trong POSIX. Bạn có thể dựa vào nó để được thiết lập. Nếu nó không được đặt, mọi thứ có thể bị hỏng, ví dụ như pwd tiện ích : Xem thêm Biến môi trường .
darkfeline
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.