ทำไมไดเรกทอรีรูทถึงด้วยเครื่องหมาย /?


95

ฉันได้ทำการวิจัยเกี่ยวกับเรื่องนี้ใน Google แล้ว แต่ผลลัพธ์ก็มีเมฆมาก ทำไม/เครื่องหมายถูกใช้เพื่อแสดงถึงไดเรกทอรีราก มีเหตุผลใดที่อยู่เบื้องหลังหรือไม่


12
เหตุผลก็คือ '/' เป็นตัวคั่นไดเรกทอรีและในขณะที่ไดเรกทอรีรากนั้นเป็นแบบนิรนามเช่นเดียวcd /homeกับการcd /home/ผนวก/ท้ายชื่อว่างให้การเข้าถึงไดเรกทอรีนั้น
เอสเอฟ

2
คุณได้อ่านนี้: en.wikipedia.org/wiki/Root_directory ?
Kevdog777

11
มันไร้ชื่อเพราะเมื่อมองจากด้านในมันเป็นขอบเขตของแผนผังไดเรกทอรีที่มองเห็นได้ ลำดับชั้นของไดเรกทอรีที่มองเห็นได้อาจเป็นเพียงแผนผังย่อยในลำดับชั้นที่มีขนาดใหญ่กว่าเช่นเมื่อการค้นหาชื่อพา ธ ถูกปรับเปลี่ยนผ่านการchroot()โทร แต่เมื่อดูจากภายในก็จะถูกแยกออกไป
โทมัส Nyman

14
เพราะสตริงว่างจะเป็นตัวเลือกที่น่ากลัว!
Bakuriu

3
นอกเหนือจากสิ่งที่กล่าวถึงการใช้ / เพื่อระบุรูทให้ผลข้างเคียงบางอย่างในแง่ของชื่อพา ธ สัมบูรณ์และสัมพัทธ์ /some/dirALWAYS หมายถึง(root)/some/dirแม้ว่าsome/dirจะสัมพันธ์กับไดเรกทอรีการทำงานปัจจุบันเสมอ หลักการนี้สามารถถ่ายโอนไปยังการใช้เว็บ URL ได้เช่นกัน
Tor Valamo

คำตอบ:


108

ทับ/เป็นตัวละคร delimiting ซึ่งแยกไดเรกทอรีในเส้นทางในระบบปฏิบัติการ Unix เหมือน ตัวละครตัวนี้ดูเหมือนจะถูกเลือกในบางครั้งในปี 1970 และตามแหล่งที่มาเล็ก ๆ น้อยๆ เหตุผลอาจจะเกี่ยวข้องกับที่บรรพบุรุษของ Unix ระบบปฏิบัติการMulticsใช้>ตัวละครเป็นตัวคั่นเส้นทาง แต่นักออกแบบของ Unix ได้จองไว้แล้ว อักขระ>และ<บ่งบอกถึงการเปลี่ยนเส้นทาง I / O บนบรรทัดคำสั่ง shell ได้ดีก่อนที่จะมีระบบไฟล์หลายระดับ ดังนั้นเมื่อถึงเวลาออกแบบระบบไฟล์พวกเขาต้องหาตัวละครอื่นเพื่อบ่งบอกถึงการแยกองค์ประกอบพา ธ

สิ่งที่ควรทราบที่นี่คือในเทอร์มินัล Lear-Siegler ADM-3A ที่ใช้กันทั่วไปในช่วงปี 1970 จากการใช้~อักขระเพื่อเป็นตัวแทนของโฮมไดเร็กตอรี่/คีย์นั้นอยู่ถัดจาก>คีย์:

รูปแบบแป้นพิมพ์ของเทอร์มินัล Lear-Siegler ADM-3A

สำหรับสาเหตุที่รูทไดเร็กทอรีถูกแทนด้วยซิงเกิ้ล/มันเป็นข้อตกลงที่น่าจะได้รับอิทธิพลมากที่สุดจากข้อเท็จจริงที่ว่ารูทไดเร็กทอรีนั้นเป็นไดเรกทอรีระดับบนสุดของลำดับชั้นไดเรกทอรีและในขณะที่ไดเรกทอรีอื่น ๆ อาจอยู่ข้างใต้ ไม่มีเหตุผลที่จะอ้างถึงสิ่งใดนอกไดเรกทอรีราก ในทำนองเดียวกันรายการไดเรกทอรีเองไม่มีชื่อเพราะมันเป็นขอบเขตของต้นไม้ไดเรกทอรีที่มองเห็นได้


2
"ในขณะที่ไดเรกทอรีอื่นอาจอยู่ข้างใต้โดยทั่วไปไม่มีเหตุผลที่จะอ้างถึงสิ่งใดนอกไดเรกทอรีราก" ฉันไม่เข้าใจสิ่งนี้ ผมไม่แน่ใจว่าทิศทางที่คุณหมายถึงโดย "ใต้" แต่มีอะไร "นอก" /ลำดับชั้นติดตั้งที่ ระบบไฟล์ Unix เป็นแผนผังเดียวที่มีจุดเชื่อมต่อสำหรับไดรฟ์ต่างๆ
alexis

4
นอกจากนี้ยังมีchrootและเช่นนั้น - คุณไม่สามารถเข้าถึงอะไรนอกรูทใหม่ แต่นั่นไม่ได้หมายความว่าพวกเขาไม่ได้อยู่ที่นั่น
Bobson

1
@Gilles ตำแหน่งทางกายภาพของไดรฟ์ไม่ใช่คำถาม ดิสก์พาร์ติชั่นใด ๆอยู่นอกพาร์ติชั่นรูทในกรณีนั้น แต่ถูกเมาท์ภายใต้รูทในลำดับชั้นของระบบไฟล์ Bobson จุดดีเกี่ยวกับ chroot แต่มันไม่เหมาะกับสิ่งที่ Thomas พูด: หลังจาก chroot ไม่ใช่ว่า "ปกติแล้วไม่มีเหตุผล" ที่จะออกไปนอกรูทของระบบ มันเป็นไปไม่ได้. บน Unix ทุกสิ่งในระบบไฟล์จะอยู่ภายใต้รูท
อเล็กซิส

1
"หลังจาก chroot ไม่ใช่ว่า" มักจะไม่มีเหตุผล "ที่จะออกไปนอกรูทระบบ; มันเป็นไปไม่ได้" นี่เป็นสิ่งที่ผิดธรรมดา ในเวลาที่chroot()แนะนำมันไม่ได้มีคุณสมบัติเหมือนคุกเลยมันมีผลกระทบต่อการแก้ไขชื่อพา ธ แม้กระทั่งวันนี้กระบวนการที่มีสิทธิพิเศษสามารถแยกออกจาก chroot โดยการออกแบบ ฉันยังกล่าวถึงchroot()ในการแสดงความคิดเห็นก่อนหน้านี้
Thomas Nyman

4
IIRC, การประชุม Multics ไม่เพียง แต่ใช้>เป็นตัวคั่นไดเรกทอรี แต่ยัง<จะอ้างถึงไดเรกทอรีแม่: <ด้วยตัวเองก็เท่ากับ..ในขณะที่คิดเป็น<foo ../fooฉันมักจะพบว่าสุนทรียภาพ
Mark Reed

55

เป็นครั้งแรกที่ระบบไฟล์แบบลำดับชั้นที่เรารู้ว่าวันนี้ได้รับการออกแบบสำหรับMultics การออกแบบอธิบายไว้ใน“ ระบบไฟล์อเนกประสงค์สำหรับเก็บข้อมูลสำรองโดย RC Daley และ PG Neumann คุณสมบัติเด่นของระบบไฟล์นี้คือไดเรกทอรีเป็นไฟล์ที่สามารถมีอยู่ในไดเรกทอรีเช่นไฟล์อื่น ๆ โครงสร้างไฟล์เป็นแผนผังซึ่งโหนดที่ไม่ใช่ใบไม้ทั้งหมดเป็นไดเรกทอรี รูทของทรีเป็นไดเรกทอรีอยู่เสมอ แต่ละไฟล์มีชื่อ (ชื่อรายการ ) ซึ่งไม่ซ้ำกันภายในไดเรกทอรีหลัก ไดเรกทอรีรากไม่มีชื่อเนื่องจากไม่มีอยู่ในไดเรกทอรีอื่น

ในการกำหนดไฟล์คุณต้องอธิบายพา ธ จากรูทของทรี Multics นำไวยากรณ์ธรรมชาติสำหรับชื่อเส้นทางซึ่งถ้าPเป็นเส้นทางไปยังไดเรกทอรีและFเป็นชื่อของไฟล์แล้วเป็นไวยากรณ์สำหรับไฟล์ที่เรียกว่าภายในไดเรกทอรีที่มีเส้นทางP>FFP

สำหรับบรรดาครั้งเมื่อคุณไม่ต้องการที่จะเป็นภาระตัวเองด้วยไดเรกทอรี Multics มีความคิดของไดเรกทอรีการทำงาน ชื่อไฟล์เปล่าที่ไม่มีตัวบ่งชี้ไดเรกทอรีถูกตีความว่าเป็นไฟล์ในไดเรกทอรีทำงาน

รวมกฎเหล่านี้fooเป็นไฟล์ในไดเรกทอรีการทำงาน foo>barเป็นไฟล์ในไดเรกทอรีลูกfooของไดเรกทอรีทำงานและอื่น ๆ กฎเหล่านี้อธิบายพา ธ สัมพัทธ์ แต่จำเป็นต้องมีกฎเสริมเพื่อสร้างพา ธ สัมบูรณ์ที่เริ่มต้นจากไดเรกทอรีราก เนื่องจากการอ่านชื่อพา ธ จากซ้ายไปขวาสอดคล้องกับการย้ายจากรูตไปยังใบไม้ของต้นไม้รูทควรระบุด้วยเครื่องหมายพิเศษที่ด้านซ้ายของชื่อพา ธ เนื่องจากชื่อไฟล์จะไม่ว่างเปล่า (เพราะมักจะทำให้สับสน) จึงไม่มีชื่อพา ธ สัมพัทธ์เริ่มต้นด้วยตัวอักษร>ซึ่งทำให้มันเป็นเครื่องหมายที่สะดวกสำหรับชื่อพา ธ สัมบูรณ์ ดังนั้น>fooไฟล์ที่เรียกว่าfooในไดเรกทอรีราก>foo>barเป็นไฟล์ที่เรียกว่าbarในไดเรกทอรีที่เรียกว่าfooในไดเรกทอรีรากและอื่น ๆ สิ่งนี้จะทิ้งไดเรกทอรีรูทซึ่งอาจเป็นสตริงว่าง แต่ก็มักจะไม่สะดวกในการใช้สตริงที่ว่างเปล่าเป็นชื่อพา ธ ดังนั้นแทนที่จะได้รับการเขียน>ซึ่งมีประโยชน์เพิ่มที่ชื่อพา ธ >เป็นที่แน่นอนและถ้าหากตัวอักษรตัวแรกของมันคือ

Unix ใช้การออกแบบนี้จาก Multics เนื่องจากยูนิกซ์ใช้อักขระ>สำหรับการเปลี่ยนเส้นทางเอาต์พุตในเชลล์คำสั่งแล้วผู้ออกแบบจึงเลือกอักขระอื่น/เพื่อแยกไดเรกทอรีในชื่อพา ธ


11

ในคอมโพเนนต์ชื่อพา ธ บน Unix ไม่สามารถใช้อักขระได้เพียงสองตัวเท่านั้น: อักขระ null ซึ่งยุติสตริงใน C (ภาษาของเคอร์เนล) และเครื่องหมายสแลชซึ่งสงวนไว้เป็นตัวคั่นพา ธ นอกจากนี้ส่วนประกอบของเส้นทางไม่สามารถเป็นสตริงว่างได้

ดังนั้นในชื่อพา ธ เรามีโทเค็นเพียงสองชนิด: สแลชและส่วนประกอบ

สมมติว่าไม่มีการเพิ่มโทเค็นใหม่เราต้องการสนับสนุนการสนับสนุนพา ธ สองประเภทคือสัมพัทธ์และสัมบูรณ์ นอกจากนี้เราต้องการให้สามารถอ้างถึงไดเรกทอรีรูทซึ่งไม่มีชื่อ (มันไม่มีพาเรนต์ซึ่งจะให้ชื่อ)

เราจะแสดงเส้นทางสัมพัทธ์เส้นทางสัมบูรณ์และอ้างถึงไดเรกทอรีรากโดยใช้เครื่องหมายทับเท่านั้นได้อย่างไร

วิธีที่ชัดเจนที่สุดในการขยายภาษา (นอกเหนือจากการแนะนำโทเค็นใหม่) คือการสร้างไวยากรณ์ใหม่: ให้ความหมายใหม่กับชุดของโทเค็นที่เป็นไวยากรณ์ที่ไม่ถูกต้อง

เส้นทางที่ขึ้นต้นด้วยเครื่องหมายทับไม่สมเหตุสมผลดังนั้นทำไมไม่ใช้เครื่องหมายทับนำหน้าเป็นเครื่องหมายซึ่งระบุว่า "เส้นทางนี้เป็นแบบสัมบูรณ์แทนที่จะเป็นแบบสัมพัทธ์"

พา ธ ที่ไม่มีอะไรนอกจากสแลชก็ไม่ถูกต้องดังนั้นทำไมไม่กำหนดความหมาย "ไดเรกทอรีราก"

ความหมายทั้งสองนี้รวมกันเนื่องจากพา ธ สัมบูรณ์เริ่มต้นค้นหาที่ไดเรกทอรีราก กล่าวอีกนัยหนึ่งว่าการเฉือนชั้นนำนั้นถือได้ว่ามีความหมาย:

  • นำทางไปยังไดเรกทอรีรากและใช้อักขระเครื่องหมายทับ
  • หากมีเนื้อหามากกว่านี้ในเส้นทางให้ดำเนินการเป็นเส้นทางสัมพัทธ์มิฉะนั้นคุณจะทำ

จากนั้นเราอาจโยนเครื่องหมายสแลชต่อท้ายซึ่งอาจหมายถึง "พา ธ นี้ยืนยันว่าคอมโพเนนต์พา ธ สุดท้ายคือชื่อของไดเรกทอรีมากกว่าไฟล์ปกติหรือวัตถุประเภทอื่น ๆ : สแลชท้ายที่ระบุว่าไดเรกทอรีนั้นคล้ายกับ วิธีที่สแลชนำหน้าแสดงถึงไดเรกทอรีรูท "

ด้วยไวยากรณ์ข้างต้นทั้งหมดนี้เรายังคงมีไวยากรณ์ที่มีความหมายที่ไม่ได้กำหนด: เครื่องหมายทับสองทับสามทับและอื่น ๆ

ทำไมไม่เพียงแค่แนะนำโทเค็นอื่นและทำมันต่างออกไป อาจเป็นเพราะนักออกแบบใช้วิธีการที่เรียบง่ายโดยทั่วไป (เหตุใดedเครื่องมือแก้ไขจึงแสดงเฉพาะ?เมื่อคุณทำบางสิ่งผิดปกติ?) เครื่องหมายทับจะพิมพ์ได้ง่ายโดยไม่ต้องเปลี่ยนอะไรเลย ภาษาพา ธ ที่มีโทเค็นเพียงสองประเภทเท่านั้น (คอมโพเนนต์และสแลช) ง่ายต่อการจดจำและใช้งาน

การพิจารณาที่สำคัญอีกประการหนึ่งคือการปรับเปลี่ยนเส้นทางอย่างง่าย ๆ ทำได้โดยใช้การแทนค่าสตริงเท่านั้น ตัวอย่างเช่นเราสามารถ "เปลี่ยนเส้นทางที่แน่นอน" ไปยังไดเรกทอรีหลักใหม่ได้อย่างง่ายดาย:

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

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

สิ่งนี้จะไม่ทำงานหากเราระบุเส้นทางที่แน่นอนด้วยวิธีอื่นเช่นป้ายดอลลาร์ชั้นนำหรืออย่างอื่น:

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#^}"

การเขียนโค้ดประเภทนี้ยังจำเป็นในบางกรณีเมื่อจัดการกับพา ธ สไตล์ Unix แต่มีจำนวนน้อยกว่า


8
"สแลชพิมพ์ง่ายไม่ต้องเปลี่ยน" บางทีคุณอาจลงจากที่นั่นข้ามสระน้ำได้อย่างง่ายดาย แต่ที่นี่ในฟินแลนด์เราไม่เพียง แต่ต้องกดปุ่ม Shift แต่ยัง ไปถึงแถวทั้งหมดด้วยเช่นกัน ; P
Thomas Nyman

1
@ThomasNyman อาจเป็นไปได้ว่ารูปแบบแป้นพิมพ์ภาษาต่างประเทศอาจจะไม่เป็นปัญหาสำหรับ Ken Thompson เครื่องหมายทับนั้นง่ายต่อการพิมพ์สำหรับนักพัฒนา Unix และผู้ใช้งานก่อนหน้านี้
Kaz

1
ยุติธรรมพอสมควร ถึงแม้ว่าผมจะได้รับส่วนใหญ่ล้อเล่นผมว่ามันน่าสนใจ (และบางครั้งก็น่าขบขัน) วิธีการบางส่วนลักษณะในซอฟแวร์ ที่มีมรดกทางยาวสามารถอธิบายได้โดยพิสดารในฮาร์ดแวร์ร่วมสมัย
Thomas Nyman

@ThomasNyman ฮ่า ๆ ฉันสงสัยว่า Bill Joy จะเข้าสู่ระบบและอัปเดตชิ้นส่วน {จำเป็นต้องมี} ในหน้า ADM-3A หรือไม่ "Wikidickhead" จะตอบโต้ด้วย: "บทความนี้มีงานวิจัยต้นฉบับ" :)
Kaz

@ThomasNyman ตอนนี้ฉันเชื่อว่ามีแป้น "คันเร่ง" ที่คุณสามารถพิมพ์การ/ใช้เท้าขวาของคุณ เหมือนเล่นเปียโน
Pacerier
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.