2012-05-04 25 views
24

Giả sử tôi có các thư mục ~/a/b trong thư mục chính và thư mục b chứa một liên kết tượng trưng đến '..' có tên 'symlink'. Sau đó, tôi thực hiện những hành động sau đây trong bash:Hành vi của cd/bash trên các liên kết tượng trưng

[email protected]:~$ cd a/b/symlink 
[email protected]:~/a/b/symlink$ pwd -P 
/home/hm/a 
[email protected]:~/a/b/symlink$ cd .. 
[email protected]:~/a/b$ pwd -P 
/home/hm/a/b 

-P pwd in thư mục làm việc hiện tại, dereferencing tất cả các liên kết tượng trưng. Tại sao thư mục làm việc/home/hm/a/b ở cuối và không/home/hm?

Trả lời

26

bash đang "thân thiện"; khi bạn cd /into/a/symlink/, vỏ nhớ vị trí cũ (trong $OLDPWD) và sẽ sử dụng rằng thư mục khi bạn cd .. theo giả định rằng bạn muốn quay trở lại vào thư mục bạn đã chỉ trong.

Nếu bạn muốn sử dụng thực.., thì bạn cũng phải sử dụng cd -P:

  The -P option says to use the physical directory 
      structure instead of following symbolic links (see 
      also the -P option to the set builtin command); 
      the -L option forces symbolic links to be followed. 
$ cd 
$ cd a/b/symlink 
$ cd -P .. 
$ pwd -P 
/home/sarnold 
$ 
+8

FYI, bạn có thể sử dụng 'thiết physical' -o hoặc' thiết -P' để làm cho hành vi này vĩnh viễn. – Kevin

+1

.. Tôi nên đề cập rằng việc thực hiện có lẽ là phù hợp hơn với mô tả của @ geekosaur; Tôi sẽ không mong đợi việc ghi đè lên 'OLDPWD' với giá trị của riêng bạn sẽ thực sự ảnh hưởng đến hành vi' cd ..'. – sarnold

+0

Tôi đồng ý rằng tôi không nghĩ rằng OLDPWD thực sự làm bất cứ điều gì ở đây. Tôi đã thử nghiệm nó bằng cách "cd" ing xuống một chuỗi liên kết tượng trưng ba cấp độ sâu và sau đó làm "cd .." một vài lần. Nó hoạt động tốt. Nếu OLDPWD đã được sử dụng, nó sẽ không hoạt động. OLDPWD chỉ nhớ một thư mục và không thể sử dụng để quay lại nhiều thư mục. Do đó, OLDPWD không được sử dụng. –

4

bash theo dõi đường dẫn thư mục hiện tại hợp lý, như được hiển thị trong lời nhắc của bạn và diễn giải những thứ như cd .. theo điều đó. Điều này làm cho mọi thứ phù hợp hơn một chút nếu bạn chỉ sử dụng đường dẫn như vậy trong cd (hoặc pushd), với chi phí bất ngờ xảy ra nếu bạn mong đợi điều tương tự xảy ra với đường dẫn trong đối số lệnh (hoặc bên trong lệnh; emacsvim các quy tắc có thể cấu hình của riêng chúng để xử lý liên kết tượng trưng, ​​nhưng hầu hết các lệnh dựa vào hạt nhân để xử lý nó).

Các vấn đề liên quan