`~ / Documents` เป็นญาติหรือเส้นทางที่แน่นอน?


37

นี่เป็นเพียงคำถามเกี่ยวกับคำศัพท์เท่านั้น

มันมาจากการสอบปฏิบัติจากหนังสือเตรียมการของLPIC คำตอบที่ถูกต้องตามหนังสือคือนั่น~/Documentsคือไดเรกทอรีที่สัมพันธ์กันเพราะมันสัมพันธ์กับไดเรกทอรีบ้าน

อย่างไรก็ตามหนังสือเล่มนี้มีอัตราส่วนของความผิดพลาดและความผิดพลาดที่น่านับถือดังนั้นฉันจึงไม่สามารถรับทุกสิ่งที่เขียนไว้ที่นั่นได้ ที่นี่ฉันไม่เห็นด้วยเพราะสำหรับฉัน~ทำหน้าที่เป็นตัวแปรที่ขยายโดยเชลล์ในเนื้อหาของ$HOMEตัวแปรหรือเส้นทางไดเรกทอรีบ้านของผู้ใช้ปัจจุบัน (cf. man bash) ดังนั้นเส้นทาง/home/myuser/Documentsที่แท้จริงจึงเป็นไดเรกทอรีแน่นอน

แม้แต่Wikipediaครั้งเดียวก็ดูเหมือนว่าฉันไม่ได้ช่วยในหัวข้อนี้ (แม้ว่ามันจะยืนยันว่าหนังสือเล่มนี้ผิดกับเรื่องนี้):

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

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

ที่นี่อีกครั้งฉันไม่เห็นด้วย: ตามคำนิยามนี้เส้นทาง/opt/kde3/bin/../libที่ไม่ขึ้นอยู่กับไดเรกทอรีงานปัจจุบันควรเป็นสิ่งที่แน่นอน แต่ความเข้าใจในปัจจุบันของฉันตรงกับผู้เขียนหนังสือทำให้เส้นทางนี้เป็นญาติ

ค้นหาเว็บอย่างรวดเร็วเป็นเพียงการเพิ่มความยุ่งยากของฉันตามพจนานุกรมเว็บสเตอร์ :

absolute path - พา ธ ที่สัมพันธ์กับไดเร็กทอรีรูท อักขระตัวแรกต้องเป็นตัวคั่นชื่อพา ธ

ดังนั้น$HOME/Documentsหรือเพียงแค่$HOMEจะไม่ถือว่าเป็นไดเรกทอรีที่แน่นอน? คำจำกัดความนี้หมายถึงการขยายตัวของตัวแปรหรือไม่? ~ตัวละครของเชลล์ล่ะ? มีคำจำกัดความที่น่าเชื่อถือของไดเรกทอรีเปรียบเทียบกับสัมบูรณ์ที่ฉันสามารถหาที่ไหนสักแห่งและฉันผิดไปตลอดทาง?


7
เส้นทางทั้งหมดนั้นสัมพันธ์กันบางเส้นทางก็สัมพันธ์กับไดเรกทอรีรูทเท่านั้นและเส้นทาง/ที่เราเรียกว่าสัมบูรณ์ ดังนั้นทุกอย่างเริ่มต้นจากสิ่งที่/ฉันจะเรียกสัมบูรณ์ (แม้ว่านี้อยู่/usr/../etc) และทุกสิ่งทุกอย่างที่ฉันจะเรียกญาติ ( ~/Doc, Doc, ../john/Doc, $HOME/..., ... ) ประเด็นคือว่าสัมบูรณ์ควรทำงานโดยไม่คำนึงถึงไดเรกทอรีการทำงานปัจจุบันหรือผู้ใช้ปัจจุบัน ญาติสามารถทำงานได้เฉพาะในบางกรณีแคบ
jimmij

6
เส้นทางสามารถขยายไปยังตำแหน่งอื่นขึ้นอยู่กับว่าผู้ใช้เป็นใคร ต้องบอกว่านี้ยังคงเป็นเส้นทางที่แน่นอนไม่ใช่เส้นทางญาติในความคิดของฉัน แม้ว่าฉันไม่คิดว่าคำจำกัดความของเส้นทางสัมบูรณ์และเส้นทางสัมพัทธ์จะถูกกำหนดอย่างแม่นยำ นี่ไม่ใช่คณิตศาสตร์ คำถามนี้ไม่ได้ทดสอบความเข้าใจ imo และไม่มีจุดหมาย
Faheem Mitha

1
@FaheemMitha: LPICเป็นการรับรอง Linux ที่เป็นกลาง การรับรองตัวเองดูเหมือนจะดี แต่มันก็ยังห่างไกลจากกรณีที่หนังสือขาย (อย่างน้อยบางส่วน) เพื่อเตรียมพร้อมสำหรับการสอบนี้เป็นการศึกษาด้วยตนเอง ...
WhiteWinterWolf

2
@jimmij: "ญาติ" มีความหมายทางเทคนิคเฉพาะในบริบทของเส้นทางและการใช้ความรู้สึกภาษาอังกฤษที่แตกต่างกันของคำว่าการปฏิบัติที่ไม่ดี ฉันไม่เห็นด้วยกับการโทรหา~/fooเส้นทางญาติ สิ่งที่คุณได้รับคือความแตกต่างระหว่างการเข้ารหัสและการกำหนดพารามิเตอร์ ดูคำตอบของฉันสำหรับรายละเอียดเพิ่มเติม
Peter Cordes

1
คำจำกัดความของ Webster Dictionary นั้นถูกต้อง แต่ก็ทำให้เกิดความสับสนมาก อย่างไรก็ตามมันแสดงถึงว่าสตริงเช่น~/Documentsและ$HOME/Documentsไม่ใช่เส้นทาง พวกเขาระบุเส้นทาง (สัมบูรณ์) หลังจากการขยาย แต่ไม่ใช่เส้นทางเอง ฉันคิดว่าเห็นด้วยกับจำนวนผู้ใช้ Unix / Linux ที่ใช้คำศัพท์ แต่ไม่ต้องสงสัยเลยว่าสตริงเหล่านั้นจะถูกเรียกว่าเส้นทางด้วยตนเอง
reinierpost

คำตอบ:


41

หากผู้เขียนพยายามที่จะไล่คุณออกโดยการพูดถึงสตริงตัวอักษรนั้น (โดยไม่มีการขยายเชลล์) เป็นเส้นทางแสดงว่าเป็นเส้นทางสัมพัทธ์ ( mkdir -p './~/Documents') มิฉะนั้น:


เป็นเส้นทางที่สมบูรณ์เนื่องจากการแก้ไขไม่ได้ขึ้นอยู่กับไดเรกทอรีการทำงานปัจจุบันของกระบวนการ เส้นทางสัมพัทธ์หมายถึงสัมพันธ์กับไดเรกทอรีการทำงานของกระบวนการ หรือในกรณีของเป้าหมาย symlink ให้สัมพันธ์กับตำแหน่งของ symlink ( gcc -> gcc-5.2เทียบกับgcc -> /usr/bin/gcc-5.2) สิ่งนี้สำคัญสำหรับ NFS-mounts และกรณีอื่น ๆ ที่คุณสามารถไปที่ symlink เดียวกันผ่านทางพา ธ สัมบูรณ์ที่แตกต่างกัน เช่น

/net/tesla/home/peter/foo -> bar  # always works from other machines

/net/tesla/home/peter/foo -> /home/peter/bar  # references my home dir on the local machine, not tesla.

เดเบียนบางครั้งจะติดตั้ง../../doc/whatever/whateversymlink แทนแทนที่จะเป็น symlink เป้าหมายดังนั้นจึงใช้งานได้เมื่อ NFS ติดตั้งที่อื่นหรือเมื่อดู chroot โดยไม่ต้องchroot(8)เข้าไป

ทุกกระบวนการของ Unix มี cwd ของตัวเอง pwdคำสั่งที่มีอยู่เพียงแค่พิมพ์

ดู: http://pubs.opengroup.org/onlinepubs/9699919799/functions/getcwd.html สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการเปลี่ยนไดเรกทอรีด้วยการเรียกระบบ POSIX


อย่างที่คนอื่น ๆ พูดกัน~คือขยายโดยเปลือกก่อนที่เส้นทางจะถูกใช้เพื่ออะไร การใช้~/bin/myprogเชลล์สคริปต์จะทำให้มันทำงานต่างกันสำหรับผู้ใช้ที่ต่างกัน ความแตกต่างระหว่าง~/bin/fooและ/home/peter/bin/fooคือหนึ่งในนั้นมีฮาร์ดโค้ดที่ตั้งในขณะที่อื่น ๆ มีพารามิเตอร์มัน เป็นข้อผิดพลาด (IMO) ในการเรียก~เวอร์ชันพา ธ ที่สัมพันธ์กัน

การพูดถึงสิ่งต่าง ๆ ที่ "สัมพันธ์กับตัวแปรสภาพแวดล้อม" นั้นทำให้เกิดความสับสน การใช้คำศัพท์ภาษาอังกฤษที่แตกต่างกันซึ่งมีความหมายทางเทคนิคเฉพาะในบริบทที่คุณใช้งานนั้นเป็นสิ่งที่ไม่ดี

ในระบบหักด้วยHOME=a/relative/path, ~/fooจะขยายตัวออกไปทางญาติ นี่จะไม่ใช่การตั้งค่าที่ใช้งานได้เลย


3
ขอบคุณสำหรับคำตอบนี้ดูเหมือนจะเป็นคำที่ครอบคลุมมากที่สุดสำหรับฉัน ฉันยังมีความรู้สึกว่าผู้เขียนผสมความคิดของเส้นทางที่เป็นที่ยอมรับเข้าด้วยกันอย่างผิด ๆ(ซึ่งผู้เขียนไม่ได้กล่าวถึงที่ใดก็ได้) /opt/kde3/bin/../libเช่นจำแนกผิดเป็นเส้นทางญาติ: มันเป็นเส้นทางที่แน่นอน แต่ไม่ได้เป็นบัญญัติหนึ่ง อย่างที่คุณพูดมันทำให้ทุกอย่างสับสนดังนั้นขอขอบคุณสำหรับการชี้แจงและข้อมูลที่เกี่ยวข้องกับ NFS :)!
WhiteWinterWolf

1
ฉันต้องสรุปว่าการเขียนหนังสือเตรียมสอบไม่ใช่เรื่องสนุกและคนที่เพิ่งใช้ Unix หรือ GNU / Linux สำหรับการใช้คอมพิวเตอร์ในชีวิตประจำวันของพวกเขาไม่ใช่คนที่เขียนหนังสือเหล่านั้น ตัวอย่างของการเรียกเส้นทางที่ไม่ใช่ canononical ว่าญาติดูเหมือนว่าดีจริงๆและที่เห็นได้ชัดกับผม man7.org/linux/man-pages/man3/realpath.3.html (และrealpath(1)) ทำทั้งสองสิ่ง: บัญญัติและสร้างสัมบูรณ์ (รวมทั้งติดตาม symlink) ดังนั้นอาจมีความสับสนเกิดขึ้น
Peter Cordes

2
ถึงกระนั้นมันก็เป็นแค่แนวคิดประจำวันธรรมดาสำหรับฉัน ฉันคิดว่ามันแปลกที่มีกระดาษแผ่นหนึ่งที่บอกว่าฉันรู้จักพวกเขา ... แต่โชคดีที่ได้รับแผ่นกระดาษของคุณ @ WhitehinterWolf เพื่อแสดงให้ทุกคนที่ชอบดูแผ่นกระดาษ :)
Peter Cordes

48

นี่เป็นคำถามเกี่ยวกับคำจำกัดความของคำศัพท์ ดังนั้นเพื่อจุดประสงค์ของคุณคำตอบคือสิ่งที่ LPIC ต้องการ แต่เราสามารถสรุปได้จากข้อเท็จจริงทางเทคนิค:

หากคุณส่งผ่าน'~/Documents'การเรียกระบบมันจะค้นหาไดเรกทอรีที่มีชื่อตรง~ในไดเรกทอรีปัจจุบัน (และอาจล้มเหลว) ดังนั้นโดยความคิดของชื่อพา ธ ที่ใช้โดยเคอร์เนลนี่คือเส้นทางสัมพัทธ์ - แต่นั่นไม่ใช่สิ่งที่เราหมายถึง

~เป็นไวยากรณ์ที่นำมาใช้โดยเชลล์ (และโปรแกรมอื่น ๆ ที่เลียนแบบเพื่อความสะดวก) ซึ่งขยายมันเป็นชื่อพา ธ จริง เพื่อแสดงให้เห็นว่า~/Documentsมีความคล้ายคลึงกับ$HOME/Documents(อีกครั้งคือเชลล์ไวยากรณ์) เนื่องจาก$HOMEควรเป็นพา ธ สัมบูรณ์ค่าของ $HOME/Documentsจึงเป็นพา ธ สัมบูรณ์เช่นกัน แต่ข้อความ$HOME/Documentsหรือ~/Documentsจะต้องมีการขยายโดยเชลล์เพื่อที่จะกลายเป็นเส้นทางที่เราหมายถึง

ดังนั้นถ้าฉันต้องการความแม่นยำและความสอดคล้องฉันจะบอกว่า~/Documentsเป็นส่วนหนึ่งของเชลล์สคริปต์ที่ขยายไปสู่เส้นทางที่แน่นอน


แน่นอนเคอร์เนลจะไม่รู้ว่า$HOMEหมายถึงอะไรเหมือนไม่มีความ~หมายว่าอะไร อย่างไรก็ตามฉันพบการอ้างสิทธิ์ว่า ~ การขยายจะทำโดยเชลล์เพื่อพิรุธ; แอปพลิเคชั่นส่วนใหญ่รองรับสิ่งนี้ซึ่งชี้ไปยังไลบรารี C แทนที่จะเป็นเชลล์ การขยายตัวแปรสภาพแวดล้อมเป็นคุณลักษณะของเชลล์ คุณสามารถเปิด~/somefile.odtใน LibreOffice ได้ แต่จะไม่$HOME/somefile.odtเปิดแม้ว่า LibreOffice จะเริ่มต้นจากเชลล์ที่มีการตั้งค่า $ HOME อย่างถูกต้อง
CVn

5
คุณสามารถพบว่ามันน่าสงสัยทุกอย่างที่คุณต้องการ แต่มันเป็นเอกสารและควรง่ายต่อการยืนยันหรือหักล้างใน C.
ไร้ประโยชน์

6
โปรแกรมอื่นใช้~ไวยากรณ์ในการเลียนแบบของเชลล์เพราะมันเป็นทางลัดที่มีประโยชน์ จริง ๆ แล้วฉันไม่รู้ว่ามีฟังก์ชั่นห้องสมุดที่ทำหน้าที่ขยายตัวหรือไม่ แต่มันเป็นสิ่งที่แยกต่างหากจากการใช้ชื่อพา ธ
Kevin Reid

2
globและwordexpทำเครื่องหมายตัวหนอนในหมู่สิ่งอื่น ๆ
o11c

2
@ MichaelKjörling: มีบางโปรแกรมที่ใช้การ~ขยายตัว ส่วนใหญ่ทำไม่ได้ ตัวอย่างเช่นถ้าคุณพิมพ์ls -l ~ที่lsโปรแกรมไม่เคยเห็น~ตัวละคร; มันถูกขยายโดยเชลล์ก่อนที่จะlsถูกเรียกใช้ ถ้าคุณจริงผ่าน~ไปlsก็จะไม่รักษามันเป็นพิเศษ; ลองls -l '~'' (ซึ่งจะพยายามแสดงรายการไฟล์ที่มีชื่ออย่างแท้จริง~)
Keith Thompson

16

หากคุณ$HOMEมี/home/white/, ~/Documents(เหมือน$HOME/Documents) จะขยายตัวเปลือก (ดูที่นี่สำหรับคำอธิบาย) ไป/home/white/Documentsซึ่งเป็นที่แน่นอนเส้นทาง

เส้นทางสัมพัทธ์คือเส้นทางที่ไม่ได้ขึ้นต้นด้วย/(หลังการขยายเชลล์) เช่น../Documentsหรือfoo/bar

บางหอยเก่าไม่ขยาย~(วิธีการbash, tcsh, zshฯลฯ ... ทำ); พวกเขาจะเห็น~/Documentsว่าเป็นเส้นทางญาติเริ่มต้นด้วย~; แต่คุณมักจะไม่มีชื่อไดเรกทอรีเช่น~(แต่คุณอาจสร้างด้วยmkdir '~'ซึ่งฉันไม่แนะนำ)


คุณควรพูดถึงว่ากระสุนชนิดใดไม่ขยาย~
Edward Torvalds

3

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


1

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


คำจำกัดความเป็นมากกว่าความคิดเห็น Wikipedia ใช้ stab สำหรับกรณีทั่วไปไม่ใช่แค่ Unix: en.wikipedia.org/wiki/ …
Peter Cordes

1

การใช้ ~ / ที่จุดเริ่มต้นทำให้พา ธ สัมบูรณ์เนื่องจาก (โดยคำจำกัดความใด ๆ ) ความสามารถในการค้นหาเอกสารไม่ได้ขึ้นอยู่กับว่าคุณอยู่ที่ไหนในปัจจุบัน อย่างไรก็ตามการขยายจะทำโดยเชลล์ไม่ใช่เคอร์เนลดังนั้นหากคุณใช้เชลล์ที่ไม่รู้จักไวยากรณ์นี้ (เช่น / bin / sh, Bourne เชลล์ดั้งเดิมไม่ใช่ bash alias) คุณจะไม่ใช้งาน โชค.

ที่น่าสนใจถ้าคุณใช้ ~ root / แทนที่ ~ / การเพิ่มประสิทธิภาพของการอ่าน $ HOME โดยทั่วไปจะไม่ใช้และจะแก้ไขเป็นค่าสัมบูรณ์หาก / etc / passwd ถูกต้อง


-1

ดูเหมือนว่าหนังสือจะมองว่าเส้นทางที่แน่นอนคือเส้นทางใด ๆ ที่ขึ้นต้นด้วย a /และเส้นทางที่สัมพันธ์กันเป็นอย่างอื่น

คุณอาจดู..และ$HOMEเป็นโทเค็นประเภทเดียวกัน ทั้งสองจะต้องถูกแทนที่สำหรับองค์ประกอบของเส้นทางก่อนที่เส้นทางจะแก้ไขให้เป็นเส้นทางที่แน่นอน


3
วิธีการคือ..อะไรเช่น$HOME? ..สามารถเป็นจุดเริ่มต้นของพา ธ ที่ส่งผ่านไปยังการเรียกของระบบโดยตรงโดยไม่จำเป็นต้องใช้การขยายเชลล์ เส้นทางดังกล่าวไม่ใช่เส้นทางที่แน่นอน มันยังคงสัมพันธ์กับกระบวนการ cwd หรือตำแหน่ง symlink นอกเสียจากว่าผู้เขียนพยายามที่จะไล่คุณออกโดยการพูดถึงสตริงตัวอักษรนั้น (โดยไม่มีการขยายตัวของเชลล์) เป็นเส้นทาง ฉันคิดว่าคุณกำลังพยายามหาข้อแก้ตัวสำหรับหนังสือเล่มนี้ แต่ฉันอยากจะบอกว่ามันผิดและอย่าให้สิ่งต่าง ๆ สับสน
Peter Cordes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.