Tại sao thư mục gốc được ký hiệu là dấu /?


95

Tôi đã thực hiện một số nghiên cứu về điều này trên Google, nhưng kết quả thì nhiều mây. Tại sao /dấu hiệu được sử dụng để biểu thị thư mục gốc. Có bất kỳ lý do vững chắc đằng sau nó?


12
Lý do là '/' là dấu phân cách thư mục và trong khi chính thư mục gốc không tên, cũng cd /hometương đương với cd /home/việc nối thêm /vào cuối tên trống cung cấp quyền truy cập vào thư mục đó.
SF.

2
Bạn đã đọc cái này chưa: en.wikipedia.org/wiki/Root_directory ?
Kevdog777

11
Nó không tên, bởi vì khi nhìn từ bên trong, nó là ranh giới của cây thư mục hiển thị. Hệ thống phân cấp thư mục hiển thị có thể chỉ là một cây con trong hệ thống phân cấp lớn hơn, chẳng hạn như khi tra cứu tên đường dẫn đã được sửa đổi thông qua một chroot()cuộc gọi, nhưng khi nhìn từ bên trong, điều này bị trừu tượng hóa.
Thomas Nyman

14
Bởi vì chuỗi rỗng sẽ là một lựa chọn khủng khiếp!
Bakuriu

3
Ngoài những gì được đề cập, sử dụng / để chỉ ra gốc cho một số tác dụng phụ nhất định về tên đường dẫn tuyệt đối và tương đối. /some/dirLUÔN có nghĩa là (root)/some/dirtrong khi some/dirluôn luôn liên quan đến thư mục làm việc hiện tại. Nguyên tắc này cũng có thể chuyển sang sử dụng URL web.
Tor Valamo

Câu trả lời:


108

Dấu gạch chéo phía trước /là ký tự phân cách phân tách các thư mục trong các đường dẫn trong các hệ điều hành giống như Unix. Nhân vật này dường như đã được chọn vào khoảng những năm 1970 và theo các nguồn thông tin , các lý do có thể liên quan đến người tiền nhiệm của Unix, hệ điều hành Multics , đã sử dụng >ký tự làm dấu tách đường dẫn, nhưng các nhà thiết kế của Unix đã dành riêng các ký tự ><để biểu thị chuyển hướng I / O trên dòng lệnh shell trước khi chúng có hệ thống tệp đa cấp. Vì vậy, khi đến lúc thiết kế hệ thống tập tin, họ phải tìm một ký tự khác để biểu thị sự phân tách thành phần tên đường dẫn.

Một điều cần lưu ý ở đây là trong thiết bị đầu cuối Lear-Siegler ADM-3A được sử dụng phổ biến trong những năm 1970, từ đó, trong số những thứ khác, việc sử dụng ~ký tự để biểu thị thư mục gốc bắt nguồn , /khóa nằm bên cạnh >phím:

cách bố trí bàn phím của thiết bị đầu cuối Lear-Siegler ADM-3A

Về lý do tại sao thư mục gốc được biểu thị bằng một đơn /, đó là một quy ước rất có thể bị ảnh hưởng bởi thực tế là thư mục gốc là thư mục cấp cao nhất của hệ thống phân cấp thư mục và trong khi các thư mục khác có thể nằm bên dưới nó, thường không có ' t một lý do để tham khảo bất cứ điều gì bên ngoài thư mục gốc. Tương tự, mục nhập thư mục không có tên, vì đó là ranh giới của cây thư mục hiển thị.


2
"trong khi các thư mục khác có thể nằm bên dưới nó, thường không có lý do để đề cập đến bất cứ điều gì bên ngoài thư mục gốc." Tôi không hiểu điều này. Tôi không chắc ý của bạn là "bên dưới", nhưng không có "bên ngoài" hệ thống phân cấp được gắn vào /. Hệ thống tập tin Unix là một cây duy nhất, với các điểm gắn kết cho các ổ đĩa khác nhau.
alexis

4
Cũng có chrootvà như vậy - bạn không thể truy cập bất cứ thứ gì bên ngoài root mới, nhưng điều đó không có nghĩa là chúng không có ở đó.
Bobson

1
@Gilles, vị trí vật lý của ổ đĩa không phải là câu hỏi. Bất kỳ phân vùng đĩa nào nằm ngoài phân vùng gốc theo nghĩa đó, nhưng nó được gắn dưới gốc trong hệ thống phân cấp tệp. Bobson, điểm hay về chroot, nhưng nó không phù hợp với những gì Thomas nói: Sau khi chroot không phải là "thường không có lý do" để đi ra ngoài hệ thống gốc; điều đó là không thể. Trên Unix, mọi thứ trong hệ thống tập tin đều nằm dưới quyền root.
alexis

1
"Sau khi chroot không phải là" thường không có lý do "để đi ra ngoài hệ thống gốc; điều đó là không thể." Điều này hoàn toàn sai. Vào thời điểm chroot()được giới thiệu, nó hoàn toàn không có bất kỳ thuộc tính nào giống như nhà tù , nó chỉ ảnh hưởng đến độ phân giải tên đường dẫn. Ngay cả ngày nay, các quy trình đặc quyền có thể thoát ra khỏi một chroot theo thiết kế . Tôi cũng đã đề cập chroot()trong một bình luận trước đó .
Thomas Nyman

4
IIRC, quy ước Multics không chỉ được sử dụng >làm dấu tách thư mục, mà còn <để chỉ thư mục mẹ: <bản thân nó tương đương với .., trong khi <footương đương với ../foo. Tôi luôn luôn thấy rằng thẩm mỹ làm hài lòng.
Mark Reed

55

Hệ thống tệp phân cấp đầu tiên như chúng ta biết ngày nay được thiết kế cho Multics . Thiết kế này được mô tả trong hệ thống tập tin đa năng dành cho lưu trữ thứ cấp của RC Daley và PG Neumann. Một đặc điểm nổi bật của hệ thống tập tin này là một thư mục là một tệp có thể được chứa trong một thư mục như bất kỳ tệp nào khác. Cấu trúc tệp tạo thành một cây, trong đó tất cả các nút không có lá là các thư mục. Các gốc của cây luôn là một thư mục. Mỗi tệp có một tên (tên mục nhập ) là duy nhất trong thư mục mẹ của nó. Thư mục gốc không có tên vì nó không có trong thư mục khác.

Để chỉ định một tệp, bạn cần mô tả đường dẫn từ gốc của cây. Multics đã sử dụng một cú pháp tự nhiên cho các tên đường dẫn trong đó if Plà đường dẫn đến một thư mục và Flà tên của một tệp, sau đó là cú pháp cho tệp được gọi bên trong thư mục có đường dẫn .P>FFP

Đối với những lúc bạn không muốn tạo gánh nặng cho mình với các thư mục, Multics có một khái niệm về thư mục làm việc . Tên tệp trần không có chỉ dẫn thư mục được hiểu là một tệp trong thư mục làm việc.

Kết hợp các quy tắc này, foolà một tệp trong thư mục làm việc; foo>barlà một tập tin trong thư mục con foocủa thư mục làm việc, và vân vân. Các quy tắc này mô tả các đường dẫn tương đối, nhưng một quy tắc bổ sung là cần thiết để xây dựng các đường dẫn tuyệt đối bắt đầu từ thư mục gốc. Cho rằng đọc tên đường dẫn từ trái sang phải tương ứng với việc di chuyển từ gốc đến lá của cây, gốc phải được chỉ định bằng một điểm đánh dấu đặc biệt ở bên trái tên đường dẫn. Vì tên tệp không bao giờ trống (vì điều đó thường gây nhầm lẫn), không có tên đường dẫn tương đối nào bắt đầu bằng ký tự >, điều này làm cho nó trở thành một điểm đánh dấu thuận tiện cho tên đường dẫn tuyệt đối. Do đó >foo, tệp được gọi footrong thư mục gốc, >foo>barlà tệp được gọi bartrong thư mục được gọifootrong thư mục gốc, v.v. Điều này để lại thư mục gốc, có thể là chuỗi rỗng; tuy nhiên, thường không thuận tiện khi sử dụng chuỗi rỗng làm tên đường dẫn, vì vậy thay vào đó, nó được viết >, có thêm lợi ích là tên đường dẫn là tuyệt đối nếu và chỉ khi ký tự đầu tiên của nó là >.

Unix đã thông qua thiết kế này từ Multics. Vì Unix đã sử dụng ký tự >để chuyển hướng đầu ra trong vỏ lệnh của nó, nên các nhà thiết kế của nó đã chọn một ký tự khác /để tách các thư mục trong tên đường dẫn.


11

Trong các thành phần tên đường dẫn trên Unix, chỉ có thể không sử dụng hai ký tự: ký tự null, chấm dứt các chuỗi trong C (ngôn ngữ của kernel) và dấu gạch chéo, được dành riêng làm dấu tách đường dẫn. Hơn nữa, các thành phần đường dẫn không thể là chuỗi rỗng.

Vì vậy, trong một tên đường dẫn, chúng ta chỉ có hai loại mã thông báo: dấu gạch chéo và thành phần.

Giả sử rằng, không cần thêm bất kỳ mã thông báo mới nào , chúng tôi muốn hỗ trợ hỗ trợ hai loại đường dẫn, tương đối và tuyệt đối. Hơn nữa, chúng tôi muốn có thể tham khảo thư mục gốc, không có tên (nó không có cha mẹ sẽ đặt tên cho nó).

Làm thế nào chúng ta có thể biểu diễn các đường dẫn tương đối, đường dẫn tuyệt đối và tham chiếu đến thư mục gốc, chỉ sử dụng dấu gạch chéo?

Cách rõ ràng nhất để mở rộng ngôn ngữ (ngoài việc giới thiệu mã thông báo mới) là tạo cú pháp mới: đưa ra ý nghĩa mới cho các kết hợp mã thông báo không hợp lệ.

Các đường dẫn bắt đầu bằng dấu gạch chéo không có ý nghĩa, vậy tại sao không sử dụng dấu gạch chéo hàng đầu làm điểm đánh dấu cho biết "đường dẫn này là tuyệt đối, thay vì tương đối".

Một đường dẫn không chứa gì ngoài dấu gạch chéo cũng không hợp lệ, vậy tại sao không gán cho nó nghĩa là "thư mục gốc".

Hai ý nghĩa này liên kết với nhau vì một đường dẫn tuyệt đối bắt đầu tìm kiếm tại thư mục gốc. Nói cách khác, một dấu gạch chéo hàng đầu có thể được coi là có ý nghĩa:

  • điều hướng đến thư mục gốc và sử dụng ký tự gạch chéo.
  • nếu có nhiều tài liệu hơn trong đường dẫn, thì hãy xử lý nó như một đường dẫn tương đối, nếu không thì bạn đã hoàn thành.

Sau đó, chúng ta cũng có thể ném vào một dấu gạch chéo, có nghĩa là "đường dẫn này khẳng định rằng thành phần đường dẫn cuối cùng là tên của một thư mục chứ không phải là một tệp thông thường hoặc bất kỳ loại đối tượng nào khác: dấu gạch chéo đó biểu thị thư mục đó tương tự như cách dấu gạch chéo hàng đầu biểu thị thư mục gốc. "

Với tất cả cú pháp trên, chúng ta vẫn có cú pháp với ý nghĩa chưa được gán: dấu gạch chéo kép, dấu gạch chéo ba, v.v.

Tại sao không chỉ giới thiệu một mã thông báo khác và làm điều đó khác đi. Điều này có lẽ là do các nhà thiết kế đã thực hiện các phương pháp tối giản nói chung. (Tại sao edtrình chỉnh sửa chỉ hiển thị ?khi bạn làm điều gì đó sai?) Dấu gạch chéo rất dễ gõ, không yêu cầu thay đổi. Một ngôn ngữ đường dẫn chỉ có hai loại mã thông báo (thành phần và dấu gạch chéo) rất dễ nhớ và sử dụng.

Một xem xét quan trọng khác là các thao tác dễ dàng của các đường dẫn có thể chỉ bằng cách sử dụng các biểu diễn chuỗi. Chẳng hạn, chúng ta có thể "root lại" các đường dẫn tuyệt đối đến một thư mục cha mới khá dễ dàng:

OLD_PATH=/old/path
NEW_HOME=/new/home

NEW_PATH="$NEW_HOME$OLD_PATH"  /new/home/old/path

Điều này sẽ không hoạt động nếu chúng tôi chỉ ra các đường dẫn tuyệt đối theo một cách khác, như ký hiệu đô la hàng đầu hoặc bất cứ điều gì khác:

OLD_PATH=^old/path  # ^ means absolute path
NEW_HOME=^new/home

# now we need more string kung-fu than just catenation
NEW_PATH="$NEW_HOME/${OLD_PATH#^}"

Loại mã hóa này vẫn cần thiết trong một số trường hợp khi xử lý các đường dẫn kiểu Unix, nhưng có ít hơn.


8
"Dấu gạch chéo rất dễ gõ, không yêu cầu dịch chuyển." Có thể bạn xuống xe dễ dàng ở bên kia ao, nhưng ở Phần Lan, chúng tôi không chỉ phải nhấn shift mà còn có thể tiếp cận tất cả các hàng số . ; P
Thomas Nyman

1
@ThomasNyman Có thể như vậy, bố trí bàn phím nước ngoài có lẽ không phải là mối quan tâm đối với Ken Thompson. Dấu gạch chéo rất dễ gõ cho các nhà phát triển Unix và người dùng đầu tiên của họ.
Kaz

1
Đủ công bằng. Mặc dù tôi chủ yếu nói đùa, nhưng tôi thấy thật thú vị (và đôi khi gây cười) làm thế nào một số đặc thù trong phần mềm với di sản dài có thể được giải thích bằng các đặc thù trong phần cứng đương đại .
Thomas Nyman

@ThomasNyman Haha, tôi tự hỏi nếu Bill Joy tự đăng nhập và cập nhật các phần {cần dẫn nguồn} trong trang ADM-3A đó, thì một số "Wikidickhead" sẽ phản bác lại: "bài viết này có chứa nghiên cứu ban đầu". :)
Kaz

@ThomasNyman, Bây giờ tôi tin rằng có bàn phím "bàn đạp", theo đó bạn có thể gõ /bàn chân phải của mình. Giống như chơi đàn piano.
Pacerier
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.