ทำไม“ cd .. ” ถึงทำงานในบรรทัดคำสั่งของ Windows


86

เมื่อพิมพ์cd..โดยไม่มีช่องว่างระหว่างcdและ..พรอมต์คำสั่ง Windows จะสลับไปยังโฟลเดอร์หลักอย่างมีความสุข มีคำอธิบายสำหรับพฤติกรรมนี้หรือไม่? คำสั่งไม่เป็นไปตามรูปแบบมาตรฐานของcommand<space>arguments

ทำงาน แต่ไม่ควร?

นอกจากนี้เหตุใดจึงไม่สร้างผลลัพธ์ที่สอดคล้องกัน

สะท้อน ..


24
หลักฐานของคำถามของคุณดูเหมือนจะเสีย คุณสามารถให้หลักฐานใด ๆ สำหรับการเรียกร้องของคุณว่าสิ่งนี้ไม่ถูกต้องทางไวยากรณ์หรือไม่?
การแข่งขัน Lightness ใน Orbit

13
ฉันไม่คิดว่า "คำสั่ง <space> อาร์กิวเมนต์" เคยเป็นรูปแบบมาตรฐานใน cmd (หรือผู้มีมาก่อน) พิจารณาตัวอย่างdir/aหรือไวยากรณ์ VMS ที่คล้ายกัน
grawity

6
ซีดีเป็นสิ่งที่พิเศษมาก คุณสามารถพิมพ์cd c:\program filesโดยไม่ต้องใส่เครื่องหมายคำพูด แต่ก็ยังใช้งานได้
phuclv

20
นี่คือบทความที่ให้ความบันเทิงอย่างมากซึ่งอธิบายถึงนิสัยใจคอของตรรกะเชลล์ของ Windows และสิ่งที่อาจทำให้เสียชีวิตได้: thedailywtf.com/articles/The-Core-Launcher
vsz

3
ทำไมถึงcd..ทำงาน เพราะไมโครซอฟท์ประสบปัญหาในการทำให้การทำงานชัดเจน cdเป็นคำสั่งที่สร้างไว้ในตัวแปลคำสั่งของ Windows และ Microsoft สามารถทำให้ล่ามทำในสิ่งที่พวกเขาต้องการ (เป็นอีกตัวอย่างหนึ่งcdไม่จำเป็นต้องมีการอ้างถึงไดเรกทอรีที่มีช่องว่างในชื่อ)
jamesdlin

คำตอบ:


106

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

อย่างไรก็ตามมีพฤติกรรมอื่นที่เข้าใจได้น้อยกว่าและอนุญาตให้ " cd.." ที่คุณถามถึงอยู่ด้วย พฤติกรรมนี้ยังช่วยให้ " cd\" สามารถทำงานได้

พฤติกรรมที่คุณอธิบายนั้นสอดคล้องกันสำหรับคำสั่งทั้งหมดภายในตัวแปลบรรทัดคำสั่ง หากคุณมีสัญลักษณ์บางอย่างรวมถึงเครื่องหมายจุดต่อเวลาสแลชหรือแบ็กสแลชจากนั้นอักขระก่อนหน้าจะถูกตรวจสอบเพื่อดูว่าเป็นคำสั่งที่อยู่ภายในเชลล์ "command line interpreter" หรือไม่ (CMD.EXE หรือ COMMAND.COM ก่อนหน้า )

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

ตอนนี้คำถามก็ถามเกี่ยวกับคำสั่งecho : นี่เป็นข้อยกเว้นที่ผิดปกติซึ่งฉันคิดว่าecho.ผู้เชี่ยวชาญ DOS เป็นที่รู้จักกันดี นี่อาจเป็นเอกสาร พฤติกรรมอย่างน้อยที่สุดก็ในCMDของ Win7 คือถ้าคำสั่งเริ่มต้นด้วย " echo." ดังนั้นช่วงแรกจะถูกละเว้น ดังนั้น " echo..hi" จะเปลี่ยนเป็นผลลัพธ์ของ " .hi" เหตุผลนี้คือเพื่อให้ " echo." สามารถใช้พิมพ์บรรทัดว่างได้ ในทางตรงกันข้ามกับ Unix คุณสามารถทำได้ง่ายๆโดยเรียกใช้echoคำสั่ง "" ด้วยตัวเอง อย่างไรก็ตามใน DOS การรันechoคำสั่ง "" ด้วยตัวเองจะแสดงผลการตั้งค่า " echo " ปัจจุบัน ในทำนองเดียวกัน DOS ถือว่า " Echo *Off*" และ "Echo *On*"เป็นค่าพิเศษที่เปลี่ยนการตั้งค่าเสียงสะท้อนในปัจจุบันหากคุณต้องการพิมพ์คำว่า" Off"ดังนั้น" Echo.Off"จะทำการหลอกลวง (อย่างน้อยก็ด้วยล่ามบรรทัดคำสั่งCMDของ Microsoft รุ่นล่าสุด)

อย่างน้อยechoคำสั่งก็มีคำอธิบายที่สมเหตุสมผล สำหรับคำสั่งที่เหลือฉันเคยคิดว่าคำสั่งภายในมีลำดับความสำคัญ อย่างไรก็ตามเมื่อฉันพยายามทำการทดสอบบางอย่างฉันพบว่ามันค่อนข้างไม่สอดคล้องกัน ฉันสาธิตสิ่งนี้ผ่านตัวอย่างที่บันทึกไว้ที่นี่


นี่คือตัวอย่างบางส่วน. ฉันใช้พรอมต์คำสั่งยกระดับเพื่อที่ UAC จะไม่เข้าใจเกี่ยวกับตัวฉันที่เขียนไปยังไดเรกทอรีราก สิ่งนี้ทำกับ CMD.EXE ของ Microsoft Windows 7 ฉันสงสัยว่าพฤติกรรมอาจแตกต่างจากเวอร์ชั่นอื่นเช่น COMMAND.COM จากเวอร์ชั่นเก่าของ MS-DOS หรือซอฟต์แวร์ที่ออกโดย บริษัท อื่น (COMMAND.COM ของ DR-DOS)

(คำตอบนี้ค่อนข้างยาวอยู่แล้วดังนั้นฉันไม่ได้รวมคำสั่งในการทำความสะอาดทั้งหมดที่ฉันทำในระบบไฟล์ของฉันมีการทำความสะอาดเล็กน้อย แต่ไม่มาก)

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

C: \ something> md cd
C: \ something> echo echo subdir >> cd \ a.bat
C: \ something> md \ a
C: \ something> . \ cd \ a.bat
subdir

C: \ something> :: ที่วิ่งออกมาจากส่วนย่อย
C: \ something> cd \ a
C: \ a> :: ที่เปลี่ยนไดเรกทอรีปัจจุบันของฉันดังนั้นcdจึงมีความสำคัญกว่า

อัปเดต:จากการทดลองต่อไปฉันพบว่าคำสั่งcdภายในจะมีความสำคัญเหนือกว่าระบบไฟล์หากไดเรกทอรีที่ระบุไม่รวมจุด ดังนั้นถ้าคุณมีไดเรกทอรีชื่อ " a.bat " คุณก็สามารถเรียกใช้ " **cd\a.bat**" และไฟล์แบตช์จะทำงาน

การสำรวจพฤติกรรมที่ใช้กันทั่วไปน้อยลง (เนื่องจากไดเรกทอรีส่วนใหญ่อาจไม่มีจุดใน) ทำให้ฉันปรับปรุงการค้นพบของฉัน ปรากฎว่าคำสั่งcdทำตัวคล้ายกับคำสั่งcopyมากกว่าที่ฉันคิดไว้ในตอนแรก

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

นี่คือตัวอย่างที่แสดงให้เห็นถึงการคัดลอกที่มีพา ธ เต็มไม่ใช้ลำดับความสำคัญเดิม (นิยมคำสั่งภายใน) เป็นcdเมื่อไม่มีการใช้ส่วนขยาย:

C: \ something> echo echo root >> \ try.bat
C: \ something> md copy
C: \ something> ไดเร็กทอรีย่อย echo echo >> copy \ try.bat
C: \ some > . \ copy \ try.bat ทำงานจาก ไดเรกทอรีย่อยไดเรกทอรี
ย่อย

C: \ something> copy \ try.bat
ไดเรกทอรีย่อย

C: \ something> :: Huh? ทำไมจึงไม่ลบล้างและเรียกใช้จากรูท
C: \ something> :: เห็นได้ชัดว่าคำสั่งคัดลอกภายในไม่มีความสำคัญมากกว่าการตรวจสอบไดเรกทอรีย่อยและชื่อไฟล์แบบเต็ม (แม้ว่าคำสั่งcdภายในจะมีลำดับความสำคัญเมื่อไดเรกทอรีไม่มีส่วนขยาย)
C: \ something> ::
C: \ บางอย่าง>:: การทดสอบอื่น: ฉันสามารถเพิ่มช่วงเวลาที่ไร้ประโยชน์ที่ท้าย
C: \ something> . \ copy .. \ try.bat
ไดเรกทอรีย่อย

C: \ something> :: โอเคเยี่ยมมาก แต่นี่จะไม่ตรวจสอบไดเรกทอรีย่อย:
C: \ something> copy .. \ try.bat
        1 ไฟล์ที่คัดลอก

C: \ something> :: ที่รันคำสั่ง copy ภายใน

การค้นพบครั้งแรกของฉันระบุว่าผลลัพธ์เหล่านี้แสดงให้เห็นว่าเชลล์บรรทัดคำสั่งให้ความสำคัญ:

  • ไปยังระบบไฟล์ (แทนคำสั่งcopyภายใน) เมื่อระบุแบ็กสแลชทันทีหลังจากชื่อของคำสั่งภายใน
  • ไปที่คำสั่งcdภายใน(แทนที่จะเป็นระบบไฟล์) เมื่อระบุแบ็กสแลชทันทีหลังชื่อของคำสั่งภายใน
  • ไปยังคำสั่งcopyภายใน(แทนระบบไฟล์) เมื่อระบุจุดทันทีหลังจากชื่อของคำสั่งภายใน

สิ่งนี้แสดงให้เห็นอย่างชัดเจนว่าพฤติกรรมนั้นไม่สอดคล้องกันระหว่างคำสั่งcopy (พร้อมชื่อไฟล์แบบเต็มรวมถึงส่วนขยาย) และคำสั่งcd (โดยไม่มีนามสกุลเป็นส่วนหนึ่งของชื่อไดเรกทอรี) เมื่อใช้แบ็กสแลชคำสั่งcopy (พร้อมนามสกุลไฟล์แบบเต็ม) จะตรวจสอบระบบไฟล์ก่อน แต่คำสั่งcdจะไม่ (หากไดเรกทอรีไม่มีส่วนขยาย)

(อัปเดต: ตอนแรกฉันคิดว่าความไม่สอดคล้องกันนั้นขึ้นอยู่กับพฤติกรรมที่แตกต่างกันระหว่างโปรแกรมต่อมาฉันค้นพบว่ามีความไม่สอดคล้องกันอยู่ แต่เกิดจากพารามิเตอร์ที่ให้มาเพิ่มเติม)

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

อย่างไรก็ตามเพื่อให้มีความแม่นยำมากขึ้นกระสุนแรกควรชี้ให้เห็นว่าเชลล์บรรทัดคำสั่งให้ความสำคัญ:

  • กับระบบแฟ้ม (แทนภายในสำเนาคำสั่ง) เมื่อระบุเครื่องหมาย, และจากนั้นที่เหลือของเส้นทางที่เต็มขวาหลังจากชื่อของคำสั่งภายใน

ต่อไปนี้จะแสดงให้เห็นว่าทำไมฉันถึงสร้างความแตกต่าง:

C: \ ที่อื่น ๆ > echo UAC ต้องการระดับความสูงสำหรับบรรทัดนี้ >> \ needext
C: \ ที่อื่น ๆ > echo UAC ระดับความสูงที่จำเป็นสำหรับบรรทัดนี้ >> \ needext.bat
C: \ ที่อื่น ๆ > md. \ คัดลอก
C: \ ที่อื่น> echo @ Echo subdir >> copy \ needext.bat
C: \ ที่อื่น> . \ copy \ needext
subdir

C: \ ที่อื่น> copy \ needext.bat
subdir

C: \ ที่อื่น> คัดลอก \ needext
        1 ไฟล์ (s)

C: \ ที่อื่น> :: UAC ยังต้องการสำหรับบรรทัดถัดไป
C: \ ที่อื่น> del \ needext
C: \ ที่อื่น> del \ needext.bat

(โปรดทราบว่าคำสั่งคัดลอกล่าสุดค้นหาไฟล์ชื่อ\ needextเนื่องจากมีการใช้คำสั่งคัดลอกภายในไฟล์\ needext.batถูกสร้างขึ้นเพื่อช่วยในการแสดงว่าบรรทัดคำสั่งที่รวมคำคัดลอกไม่เคยใช้.)

ณ จุดนี้ฉันสร้างความไม่สอดคล้องกัน (ด้วยพฤติกรรมของคำสั่งcopy ) เมื่อมีการใช้แบ็กสแลช ...

ต่อไปฉันจะแสดงให้เห็นว่ามีความสอดคล้องกันระหว่างคำสั่งเหล่านี้ (ดังนั้นมีความสอดคล้อง ... เอ่อ ... บางครั้งเราอาจมีความมั่นคงไม่สอดคล้องกัน) สิ่งที่ฉันจะแสดงต่อไปคือคำสั่งcdทำตัวเหมือนคำสั่งคัดลอกเมื่อใช้จุด สำเนาคำสั่งใช้คำสั่งภายในและเพื่อไม่cdคำสั่ง

C: \ something> md. \ yetmore

C: \ something> cd. butmore

C: \ something \ yetmore> md. \ md
C: \ something \ yetmore> echo echo subdir >> md \ test.bat
C: \ something \ yetmore> . \ md. \ test
subdir

C: \ something \ yetmore> md. \ test

C: \ something \ yetmore> md. \ test
มีไดเรกทอรีย่อยหรือไฟล์. \ test อยู่แล้ว

C: \ something \ yetmore> :: ข้อผิดพลาดนั้นแสดงว่าเราเรียกใช้คำสั่งภายใน
C: \ something \ yetmore> md .. \ test
C: \ something \ yetmore> md. \ cd
C: \ something \ yetmore> copy. \ md cd
. \ md \ test.bat
        1 ไฟล์ (s) คัดลอก

C: \ something \ yetmore> . \ cd. \ test
subdir

C: \ something \ yetmore> cd. \ test
C: \ something \ yetmore \ test> :: คำสั่งภายในทำงานร่วมกับหนึ่งช่วงเวลา
C: \ something \ yetmore \ ทดสอบ> cd ..
C: \ something \ yetmore> . \ cd .. \ test
subdir

C: \ something \ yetmore> cd .. \ test
C: \ something \ test> :: คำสั่งภายในยังมีลำดับความสำคัญเมื่อสองจุดคือ มือสอง

ดังนั้นในช่วงเซสชั่นการทดสอบครั้งแรกซึ่งส่วนใหญ่มุ่งเน้นไปที่คำสั่งcdและcopy (ด้วยการใช้งานเพิ่มเติมของmdและบิตของdel ) ครั้งเดียวที่เรามีระบบไฟล์ที่มีลำดับความสำคัญคือด้วยคำสั่งคัดลอกแล้ว ระบบไฟล์มีความสำคัญเมื่อใช้เส้นทางแบบเต็ม

หลังจากการตรวจสอบภายหลังฉันพบว่าคำสั่งcdยังให้ความสำคัญกับระบบไฟล์เมื่อใช้ส่วนขยาย อย่างน้อยนี่หมายความว่าคำสั่งภายในได้รับการปฏิบัติให้สอดคล้องกันมากขึ้น อย่างไรก็ตามมันก็หมายความว่าเราได้รับพฤติกรรมที่แตกต่างกันตามชื่อของวัตถุระบบไฟล์ (ไฟล์หรือไดเรกทอรี) ดูเหมือนว่าพฤติกรรมกำลังใช้ตรรกะภายในบางอย่างที่คลุมเครือจริงๆ ดังนั้นการนับการทำงานนี้เพื่อทำงานกับระบบปฏิบัติการที่แตกต่างกันจึงเป็นสิ่งที่ฉันคิดว่าไม่ปลอดภัยที่จะทำ


"พฤติกรรมที่คุณอธิบายนั้นสอดคล้องกันสำหรับคำสั่งทั้งหมดภายในตัวแปลบรรทัดคำสั่ง" ipconfigตัวอย่างเช่นทำงานเกินไป
Jonas Köritz

@ JonasKöritz: เลขที่คุณสามารถใส่ (ไปข้างหน้า) เฉือนขวาหลังจากคำสั่งว่า " IPConfig " IPCONFIG/ALLและว่าจะทำงานเช่น อย่างไรก็ตามนั่นไม่ใช่สิ่งที่ฉันพูดถึง " พฤติกรรมที่คุณอธิบาย " (ในคำถามของคุณ) คือพฤติกรรมของการวางจุดหลังจากชื่อคำสั่ง หากฉันพิมพ์IPConfig.ฉันจะได้รับข้อผิดพลาดเกี่ยวกับคำสั่งที่ไม่พบ ในทำนองเดียวกัน (แม้ว่าสิ่งนี้จะไม่เกี่ยวข้องกับพฤติกรรมที่คุณอธิบาย) ถ้าฉันพิมพ์IPCONFIG\ALLจากนั้นฉันสามารถเรียกใช้.\IPCONFIG\ALL.BATไฟล์ที่กำหนดเองที่ฉันทำ ดังนั้น/จะไม่ได้รับการปฏิบัติเหมือน.หรือ `` `
TOOGAM

1
ฉันจะยอมรับคำตอบของคุณเพื่อชื่นชมงานและการวิจัยเพื่อสร้างมัน!
Jonas Köritz

2
@Calchas การทดสอบอย่างง่าย - ลองดำเนินการcopy.exeหรือcopy.comในคำสั่ง มันใช้งานไม่ได้ - ไม่ใช่ไฟล์ที่ปฏิบัติการได้
Luaan

1
@ Luann: เกี่ยวกับipconfigฉันไม่เห็นด้วยกับข้อสรุปของคุณ คำถามนี้เกี่ยวกับสิ่งที่พิมพ์ที่จุดเริ่มต้นของบรรทัดคำสั่ง Windows / DOS ระบุไฟล์ที่เรียกทำงานได้ด้วยนามสกุลไฟล์ดังนั้นคุณจึงไม่สามารถเรียกใช้โปรแกรมที่เรียกว่า "ipconfig" โดยไม่มีนามสกุล (ใน Windows ซึ่งแตกต่างจาก Unix ที่อนุญาตสิ่งนี้) เกี่ยวกับความคิดเห็นต่อไปฉันไม่รู้ว่าใครเป็น "Calchas" (เมื่อคุณระบุเครื่องหมาย at โดยปกติจะเป็นอักขระตัวแรกของผู้ใช้ที่ปรากฏที่อื่นในหน้า) ฉันยอมรับการเรียกใช้ " copy.exe" จะใช้copyคำสั่งภายใน(และผ่าน.exe) (คุณสามารถเรียกใช้.\copy.exe)
TOOGAM

41

คุณสมมติว่าชื่อคำสั่งและอาร์กิวเมนต์ต้องคั่นด้วยช่องว่างโดยเฉพาะ แต่นี่ไม่ใช่ความจริง ตราบใดที่การตีความสามารถตีความได้อย่างไม่ผิดเพี้ยน

ในกรณีนี้อาร์กิวเมนต์แรกเริ่มต้นด้วย.และ.ไม่สามารถเป็นส่วนหนึ่งของชื่อคำสั่งได้cdและ..แยกเป็นโทเค็นที่แยกกันสองตัว

โดยปกติอาร์กิวเมนต์แรกของคุณจะเริ่มต้นด้วยตัวอักษร (เช่นจุดเริ่มต้นของเส้นทาง) ดังนั้นมันจะ "ตก" ในชื่อคำสั่งของคุณและทำให้เกิดข้อผิดพลาด ... แต่นั่นไม่ใช่ปัญหาไวยากรณ์ มันเป็นความหมาย

คุณสามารถเห็นเอฟเฟกต์เดียวกันกับที่ทำงานกับคำสั่งอื่นรวมถึงecho:

echo...
..

ในกรณีนี้เราได้รับเพียงสองงวดเพราะคำสั่งตัวเองมีกฎพิเศษเพื่อที่ว่าต่อไปนี้:echo

echo .

หรือโดยการขยายสิ่งนี้:

echo.

เอาต์พุตเฉพาะบรรทัดว่าง มันสะดวก เห็นได้ชัดว่ามีการใช้งานโดยไม่สนใจช่วงเวลานำในการโต้แย้ง

เฮ้นี่คือ DOS / Batch คุณต้องการมีสติ? : D


2
ผมถือว่านี้เพราะมันเป็นเอกลักษณ์ของสายหน้าต่างคำสั่งทุบตีเช่นจะไม่ยอมให้คุณทำcd..
โจนัสKöritz

47
@ JonasKöritz: นั่นเป็นโปรแกรมที่แตกต่างอย่างสิ้นเชิงในระบบปฏิบัติการที่แตกต่างกันโดยสิ้นเชิง จักรยานของฉันไม่อนุญาตcd..เช่นกัน :)
Lightness Races ใน Orbit

15
@ JonasKöritz:alias cd..='cd ..'
mouviciel

5
@LightnessRacesinOrbit: แต่เดิมมันเป็นทางลัดในการกรอง.และ..ปรากฏเป็นไดเรกทอรีในทุก ๆ ไดเรกทอรีและเท่าที่ฉันรู้ไม่เคยมีความตั้งใจที่จะจับมากกว่านั้น จริง ๆ แล้วฉันคิดว่าการซ่อนแบบจำลองเป็นไฟล์แอตทริบิวต์การออกแบบที่สะอาดกว่าการที่มันติดตามโดยปริยายจากชื่อไฟล์
Joey

4
@joey - ฉันคิดว่าจุดที่เกี่ยวข้องมากขึ้นไม่ว่าวิธี DOS ถูกง่ายก็ว่าDOS ไม่อนุญาตให้มี.ในชื่อไฟล์ซึ่งหมายความว่ามันไม่สามารถเป็นส่วนหนึ่งของชื่อคำสั่งได้ดังนั้นจึงต้องได้รับส่วนหนึ่งของการโต้แย้ง แม้ว่า DOS ได้แบ่งคำสั่งออกเป็นอาร์กิวเมนต์เช่นเดียวกับที่ Unix shell ทำ แต่ก็ยังคงวาง.คำสั่งไว้ในอาร์กิวเมนต์แรกเนื่องจากมันจะไม่สมเหตุสมผลเลยที่จะใส่อักขระที่ไม่ถูกต้องลงในชื่อคำสั่ง
Jules

19

cd..คำสั่งที่ถูกต้องและมันถูกกำหนดไว้เช่นนั้นในการแปลคำสั่งเดิมซึ่งต่อมาได้รับการตั้งชื่อว่าcommand.comcmd.exe

ล่ามคำสั่งรู้วิธีที่จะดำเนินการcd..เพราะเป็นตัวละครพิเศษเช่นเดียวกับ.\


8
ฉันเดาว่าปัญหาหลักคือคำสั่งไม่สามารถ "syntactically ไม่ถูกต้อง" เนื่องจากไม่ได้ระบุไวยากรณ์อย่างเป็นทางการที่ใดก็ได้ดังนั้นหากการใช้งานหลัก (cmd.exe และ / หรือ MS-DOS) ยอมรับมันก็ต้องถูกต้อง
grawity

3
นอกจากนี้ซีดีไม่ใช่โปรแกรม แต่เป็นคำสั่งภายใน เช่นเดียวกับ Echo ซึ่งเป็นคำสั่งภายในก็ไม่จำเป็นต้องมีที่ว่างในการทำงาน echo.ทำงานได้เช่นกันซึ่งจะพิมพ์บรรทัดว่าง
LPChip

2
@Overmind echoe จะไม่ทำงานอย่างใดอย่างหนึ่งดังนั้นจึงเหมือนกันกับ cd, echo, md, ฯลฯ
LPChip

2
@ JonasKöritzสิ่งที่.ไม่ได้ลดลง แต่มีการเพิ่มพื้นที่ว่าง md.testและทั้งสร้างไดเรกทอรีmd .test .testพิมพ์ดีดcd.testและจะเปลี่ยนเป็นไดเรกทอรีcd .test .test
daniel.neumann

6
@ JonasKöritz: เพราะไวยากรณ์ไม่เคยมี command-space-arguments
การแข่งขัน Lightness ใน Orbit

11

มันเป็นการแฮ็คเข้ากันได้ย้อนหลัง

ล่ามบรรทัดคำสั่งได้รับการออกแบบให้สามารถใช้งานร่วมกับคำสั่งจากล่ามคำสั่ง MSDOS ดั้งเดิมซึ่งออกแบบมาให้ใช้งานร่วมกับล่ามคำสั่ง CP / M ได้ CP / M หรือ MSDOS ไม่อนุญาตให้ใช้.ในชื่อไฟล์ (ถูกตีความว่าเป็นตัวคั่นระหว่างสองส่วนของชื่อไฟล์ชื่อฐานและส่วนขยาย) นี่หมายความว่า (อย่างน้อยสำหรับรุ่นแรก ๆ ของ DOS) ตัวแปลคำสั่งสามารถระบุได้ว่าถ้าถึง '' (หรือแน่นอนตัวละครอื่น ๆ ที่ผิดกฎหมายในชื่อไฟล์) มันผ่านจุดสิ้นสุดของชื่อคำสั่งและเป็นข้อโต้แย้งคำสั่ง นี่เป็นสิ่งที่ใช้กันทั่วไปในทั้ง DOS และ CP / M ตัวอย่างเช่นdir/wเป็นคำสั่งที่พบบ่อยมากเทียบเท่ากับdir /wความหมายของรายการไฟล์ในรูปแบบแนวนอน

ทุกวันนี้ '.' สามารถปรากฏในชื่อไฟล์ สิ่งนี้ทำให้เกิดความยุ่งยากในการแยกคำสั่ง แต่เชลล์ยังคงระบุ.ว่าไม่ใช่ส่วนหนึ่งของชื่อไฟล์ที่แน่นอนว่าเป็นจุดเริ่มต้นของการขัดแย้ง สิ่งนี้มีความจำเป็นอย่างยิ่งเนื่องจากผู้ใช้หลายล้านคนคุ้นเคยกับการพิมพ์cd..หรือมีไฟล์แบตช์echo.จำนวนมากที่ประกอบด้วยคำสั่งนั้นหรือหรือจำนวนคำสั่งอื่นที่คล้ายคลึงกัน

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