cd .. trên thư mục gốc


44

Tại sao cd .., gõ vào thư mục gốc, không cảnh báo hoặc không có lỗi?

Tôi mong chờ:

/$ cd ..
-bash: cd: ..: No such file or directory

Thay vào đó, tôi rời đi tại /. Tất nhiên, điều này là do ..tồn tại trong /, và chỉ đơn giản là /, giống như .. Tôi chỉ tự hỏi tại sao nó lại như vậy.


6
Không có câu trả lời, nhưng đây là một bài đọc liên quan tốt, Rob Pike trên G + thảo luận về nguồn gốc của (các) dotfile.
bsd

Câu trả lời:


53

Theo Nhóm mở (chịu trách nhiệm về tiêu chuẩn POSIX):

Mỗi thư mục có chính xác một thư mục mẹ được biểu thị bằng tên dot-dot trong thư mục đầu tiên. [...] Những gì tên tệp dot-dot đề cập đến liên quan đến thư mục gốc được xác định theo thực thi. Trong phiên bản 7, nó đề cập đến chính thư mục gốc; đây là hành vi được đề cập trong POSIX.1-2008. Trong một số hệ thống nối mạng, cấu trúc /../hostname/ được sử dụng để chỉ thư mục gốc của máy chủ khác và POSIX.1 cho phép hành vi này.

(Nguồn)


29

Bạn không gặp lỗi vì ngay cả /thư mục thực sự mục nhập thư mục hợp lệ .., nhưng không giống như các thư mục khác, nó trỏ đến chính thư mục và do đó hoạt động giống hệt .:

$ ls -lid / /. /..
128 drwxr-xr-x 22 root root 4096 Apr 15 11:26 /
128 drwxr-xr-x 22 root root 4096 Apr 15 11:26 /.
128 drwxr-xr-x 22 root root 4096 Apr 15 11:26 /..
$

Như cột đầu tiên nói với bạn, ., .., và /tất cả đều có cùng một inode-số và do đó là những mục hệ thống tập tin tương tự.

Vì vậy, ngay cả khi bạn cd ..bên trong /bạn chỉ ở trong /.


13
Câu hỏi đặt ra yêu cầu lý do tại sao các ..mục nhập thư mục là ở đó.
Nick Matteo

3
Lý do duy nhất xuất hiện trong đầu tôi là bạn muốn đối xử /giống như bất kỳ thư mục nào khác, bao gồm cả mục nhập hợp lệ ... Nếu không, bạn sẽ phải đối xử /khác so với tất cả các thư mục khác trong hệ thống.
Dohn Joe

15

Nó ở đó bởi vì loại bỏ nó sẽ yêu cầu tạo mã xử lý trường hợp đặc biệt trong kernel và các thư viện C. Ngay bây giờ bạn có thể cho rằng sẽ luôn có một '.' và '..' trong bất kỳ thư mục nào bạn đến.

Mã trường hợp đặc biệt duy nhất được yêu cầu ngay bây giờ là trong mã gắn hệ thống tệp, trong đó mã ghi đè giá trị inode của '..' để trỏ đến thư mục chứa điểm gắn kết, vì các thư mục gốc không phải luôn luôn là thư mục gốc.


Rốt cuộc, không thể 'giới thiệu phụ huynh' trong các cấu trúc cây không có bất kỳ xử lý trường hợp đặc biệt nào, phải không? Rễ phải đặc biệt theo định nghĩa, và bất kỳ nỗ lực che dấu nào sẽ dẫn đến các trường hợp đặc biệt hoặc nhầm lẫn ở nơi khác.
musiphil

@musiphil Trong unix, các trường hợp đặc biệt ở đây được xáo trộn theo mountlệnh và tệp đặc biệt liên quan của nó /etc/fstab.
luser droog

1

Một cách khác để kiểm tra những gì ...tại /thực sự là:

$ readlink -f ..
/home

$ readlink -f /.
/

$ readlink -f /..
/

Như bạn có thể thấy, ...được chỉ vào /.


1

Một lý do khác '..' là trong / là nếu không có nó sẽ tạo ra một trường hợp đặc biệt khác: thư mục gốc sẽ có một liên kết cứng ít hơn tất cả các thư mục khác (tất cả các nút thư mục có n + 2 liên kết, trong đó n là số lượng thư mục con trực tiếp bên trong). Điều này sẽ phá vỡ các chương trình khác nhau dựa vào để tối ưu hóa quét thư mục.


0

Thật tuyệt khi nó ở đó, vì nếu không tôi sẽ không thể spam ../../../../để lấy thư mục gốc từ một thư mục. Nếu nó không cho phép ..root thì tôi sẽ bị kẹt khi đếm số lượng thư mục trong thư mục đang hoạt động.


10
Có chuyện gì với bạn cd /vậy?
Bạch

@Bach Đôi khi, việc nghiền bàn phím thú vị hơn. Bên cạnh đó, trong nhiều trường hợp bạn không cố gắng đi đến root, trong trường hợp đó sử dụng ../là tốt hơn. Tôi cũng thực hiện nhiều thao tác tệp trong PHP, nơi tôi không thể thực hiện /vì nhiều lý do.
Skylar Ittner

2
Mặt trái là có thể bạn vô tình nhập quá nhiều ../s và hoạt động (hoặc xóa) một tệp mà bạn không có ý định mà không có lỗi.
jamesdlin

4
Lặp đi lặp lại ../nhiều lần hơn mức cần thiết và mong muốn nó hoạt động như dự định trông giống như một lỗi logic (không hoạt động) đối với tôi, ngay cả khi hệ thống tập tin rõ ràng cho phép nó.
musiphil

@musiphil gõ khoảng trắng ở giữa các lệnh - là lỗi logic (giả định rằng tất cả các khoảng trắng giữa đuôi -f | grep là bắt buộc). Hầu hết những người unix phải chịu đựng nó. Nhập '../ ..' trông giống như một vấn đề dân gian của Windows (theo mặc định, cmd bắt đầu trong X: \ Windows và bạn phải spam .. ngay từ đầu). Tại sao để chữa lành một vấn đề nhỏ khi có một vấn đề lớn hơn? (dấu cách)
kagali-san
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.