ในคอมโพเนนต์ชื่อพา ธ บน 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 แต่มีจำนวนน้อยกว่า
cd /home
กับการcd /home/
ผนวก/
ท้ายชื่อว่างให้การเข้าถึงไดเรกทอรีนั้น