cd .. ในโฟลเดอร์รูท


44

ทำไมcd ..พิมพ์ที่โฟลเดอร์รากไม่เตือนหรือล้มเหลวด้วยข้อผิดพลาด?

ฉันคาดหวัง:

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

ฉันกลับไป/แล้ว ของหลักสูตรนี้คือเนื่องจาก..ไม่อยู่ใน/และเป็นเพียงเช่นเดียวกับ/ .ฉันแค่สงสัยว่าทำไมมันเป็นเช่นนั้น


6
ไม่มีคำตอบ แต่นี่คือการอ่านที่เกี่ยวข้องที่ดี Rob Pike บน G + พูดถึงจุดกำเนิดของ dotfile
bsd

คำตอบ:


53

ตาม Open Group (รับผิดชอบมาตรฐาน POSIX):

แต่ละไดเรกทอรีมีหนึ่งไดเรกทอรีหลักที่แน่นอนซึ่งจะถูกแทนด้วยชื่อจุดจุดในไดเรกทอรีแรก [... ] สิ่งที่ชื่อไฟล์dot-dotอ้างถึงสัมพันธ์กับสารบบรูทคือการกำหนดการใช้งาน ในเวอร์ชัน 7 มันอ้างถึงไดเรกทอรีรูตเอง นี่คือพฤติกรรมที่กล่าวถึงใน POSIX.1-2008 ในระบบเครือข่ายบางระบบก่อสร้าง/../hostname/จะใช้เพื่ออ้างถึงไดเรกทอรีรากของโฮสต์อื่นและ POSIX.1 อนุญาตพฤติกรรมนี้

(ที่มา)


29

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

$ 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 /..
$

ในฐานะที่เป็นคอลัมน์แรกจะบอกคุณ., ..และ/ทุกคนมีไอโหนดจำนวนเดียวกันและทำให้เป็นระบบแฟ้มรายการเดียวกัน

ดังนั้นแม้ว่าคุณcd ..ภายในของคุณเพียงแค่อยู่ใน//


13
คำถามถามว่าทำไมมี..รายการไดเรกทอรี
Nick Matteo

3
เหตุผลเดียวที่อยู่ในใจของฉันคือการที่คุณต้องการที่จะรักษา/เช่นเดียวกับโฟลเดอร์อื่น ๆ ..รวมทั้งรายการที่ถูกต้องสำหรับ มิฉะนั้นคุณจะต้องปฏิบัติ/แตกต่างกันเมื่อเปรียบเทียบกับโฟลเดอร์อื่น ๆ ทั้งหมดในระบบ
Dohn Joe

15

มันมีเพราะการลบมันจะต้องสร้างรหัสการจัดการกรณีพิเศษในเคอร์เนลและห้องสมุด C ตอนนี้คุณสามารถคิดได้ว่าจะมี '.' อยู่เสมอ และ '.. ' ในไดเรกทอรีใด ๆ ที่คุณไป

รหัสกรณีพิเศษเฉพาะที่จำเป็นในขณะนี้คือในรหัสการติดตั้งระบบไฟล์ซึ่งรหัสจะแทนที่ค่า inode ของ '.. ' เพื่อชี้ไปยังไดเรกทอรีที่มีจุดเชื่อมต่อเนื่องจากไดเรกทอรีรากไม่ได้เป็นไดเรกทอรีรากเสมอ


ท้ายที่สุดมันเป็นไปไม่ได้ที่ 'ผู้ปกครอง - ผู้อ้างอิง' ในโครงสร้างต้นไม้จะไม่ต้องจัดการกับกรณีพิเศษใด ๆ ใช่ไหม? รากต้องเป็นพิเศษตามคำจำกัดความและความพยายามใด ๆ ที่จะปกปิดซึ่งจะนำไปสู่กรณีพิเศษหรือความสับสนอื่น ๆ
musiphil

@musiphil ในยูนิกซ์กรณีพิเศษที่นี่มีการสับออกไปสั่งการและแฟ้มพิเศษที่เกี่ยวข้องmount /etc/fstab
luser droog

1

อีกวิธีหนึ่งในการตรวจสอบสิ่งที่.และ..ใน/จริงๆคือ:

$ readlink -f ..
/home

$ readlink -f /.
/

$ readlink -f /..
/

ในขณะที่คุณสามารถดู.และจะชี้ไปที่../


1

อีกสาเหตุ '.. ' อยู่ใน / คือถ้าไม่มีมันจะสร้างอีกกรณีพิเศษ: ไดเรกทอรีรากจะมีหนึ่งฮาร์ดลิงก์น้อยกว่าไดเรกทอรีอื่น ๆ ทั้งหมด (โหนดไดเรกทอรีทั้งหมดมีลิงค์ n + 2 โดยที่ n คือ จำนวนไดเรกทอรีย่อยโดยตรงภายใน) สิ่งนี้จะทำให้โปรแกรมต่าง ๆ ที่ใช้ในการเพิ่มประสิทธิภาพของการสแกนไดเรกทอรี


0

เป็นเรื่องที่ดีที่มีเพราะไม่เช่นนั้นฉันจะไม่สามารถส่งสแปม../../../../ไปยังรูทจากโฟลเดอร์ได้ หากไม่อนุญาตให้ใช้..ที่ root แล้วฉันจะติดนับจำนวนโฟลเดอร์ลง dir ทำงานคือ


10
มีอะไรผิดปกติกับcd /?
Bach

@Bach บางครั้งการบดแป้นพิมพ์ก็สนุกกว่า นอกจากนี้ในหลาย ๆ กรณีคุณไม่ได้พยายามไปที่รูทซึ่งในกรณีนี้การใช้งาน../จะดีกว่า ฉันยังทำงานกับไฟล์จำนวนมากใน PHP ซึ่งฉันไม่สามารถทำได้/ด้วยเหตุผลหลายประการ
Skylar Ittner

2
ด้านพลิกคือบางทีคุณอาจป้อนไฟล์มากเกินไป../และทำงานบน (หรือลบ) ไฟล์ที่คุณไม่ต้องการโดยไม่มีข้อผิดพลาด
jamesdlin

4
ทำซ้ำ../หลาย ๆ ครั้งเกินความจำเป็นและต้องการให้มันทำงานตามที่ตั้งใจดูเหมือนข้อผิดพลาดทางตรรกะ (อยู่เฉยๆ) สำหรับฉันแม้ว่าระบบไฟล์จะอนุญาต
musiphil

@musiphil การเว้นวรรคในการพิมพ์ระหว่างคำสั่ง - เป็นข้อผิดพลาดทางตรรกะ (สมมติว่าช่องว่างทั้งหมดระหว่างtail -f | grepเป็นสิ่งที่ต้องทำ) คน unix ส่วนใหญ่ประสบจากมัน การพิมพ์ '../ .. ' ดูเหมือนว่าปัญหา Windows-folk (โดยค่าเริ่มต้น cmd จะเริ่มใน X: \ Windows และคุณต้องสแปม .. ตั้งแต่ต้น) ทำไมต้องรักษาปัญหาเล็ก ๆ เมื่อมีปัญหาใหญ่กว่า? (ช่องว่าง)
kagali-san
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.