คุณจะป้อนไดเรกทอรีที่ชื่อเป็นลบได้อย่างไร


26

ฉันดาวน์โหลดlessnไปยังเว็บเซิร์ฟเวอร์ของฉันและคลายซิปแล้ว

-มันมีโฟลเดอร์ชื่อ ฉันคิดว่าฉันรู้วิธีจัดการกับสิ่งนั้น แต่ฉันไม่ทำ

ฉันพยายามcd -- -แล้ว แต่นั่นก็ไม่ได้มีผลที่ต้องการ ดูเหมือนว่าการใช้เครื่องหมายคำพูดจะไม่ส่งผลกระทบใด ๆ ฉันใส่สแลชทั่วสถานที่ไม่มีประโยชน์

วิธีที่เหมาะสมในการเปลี่ยนเป็นโฟลเดอร์นี้คืออะไร?

คำตอบ:


34

คุณต้องการหลีกเลี่ยงไม่ให้มันเป็นพารามิเตอร์ดังนั้นเราจึงพยายามเติมบางสิ่งลงไป ไดเรกทอรีปัจจุบันสามารถเข้าถึงได้ด้วย.จึงโฟลเดอร์ย่อยสามารถเข้าถึงได้ด้วยอีกทางเลือกหนึ่ง-./-

cd ./-

เหตุผลที่ใช้cd -- -ไม่ได้เนื่องจากมีการใช้งานที่แตกต่างกันหากคุณเปรียบเทียบrm(ดูman rm) กับcd(ดูman bashหรือman cd) cdมีการตีความที่แตกต่างซึ่งเห็น-ว่าเป็นพารามิเตอร์ (ดูman bashหรือman cd)

มันควรจะสังเกตว่าcdเป็นฟังก์ชั่นของเชลล์ในตัวที่สามารถอ่านได้ในคำตอบนี้ :

cdไม่ใช่คำสั่งภายนอก - มันเป็นฟังก์ชั่นของเชลล์ในตัว มันทำงานในบริบทของเชลล์ปัจจุบันและไม่ใช่ตามคำสั่งภายนอกในบริบท fork / exec'd เป็นกระบวนการแยกต่างหาก

มีภายนอกเป็นcdคำสั่ง แต่ก็ทำอะไรบางอย่างที่แตกต่างกันอย่างสิ้นเชิง

สิ่งนี้อธิบายว่าทำไมการนำไปปฏิบัตินั้นแตกต่างกันเนื่องจากBashและCoreutilsเป็นสองสิ่ง

สมมุติว่าคุณไม่เชื่อเรื่องนี้เราจะยืนยันได้อย่างไร การใช้งานและwhichtype

 $ which cd && type cd
which: no cd in (/usr/local/bin:/usr/bin:/bin:/opt/bin:/usr/x86_64-pc-linux-gnu/gcc-bin/4.7.2:/usr/games/bin
cd is a shell builtin
 $ which rm && type rm
/bin/rm
/bin/rm is /bin/rm

ดูman whichข้อมูลเพิ่มเติมและman bashหรือman typeสำหรับtype


4
ไม่ได้มีการใช้ "-" ในยูทิลิตี้มาตรฐานทั้งหมด แต่มีไว้เพื่อสิ้นสุดตัวเลือก "-" เพียงอย่างเดียวไม่รู้จักเป็นตัวเลือก แต่เป็นไดเรกทอรีก่อนหน้า
Stéphane Chazelas

4
วิธีแก้ไขที่ถูกต้อง แต่คำอธิบายนั้นผิด มันไม่เกี่ยวข้องอย่างสมบูรณ์ว่าcdเป็น builtin เหตุผลที่cd -- -ใช้งานไม่ได้นั่น-คือตัวถูกดำเนินการไม่ใช่ตัวเลือก
Gilles 'ดังนั้น - หยุดความชั่วร้าย'

1
บน Mac OS X cd -- -จะเปลี่ยนคุณเป็นไดเรกทอรีที่มีชื่อ-ในไดเรกทอรีปัจจุบัน FWIW
ทิมเคนเนดี้

ความคิดเห็นส่วนใหญ่สะท้อนให้เห็นในส่วนที่สองของโพสต์ของฉัน
Tamara Wijsman

22

เครื่องหมายลบ (aka dash) เพียงอย่างเดียวไม่ใช่ตัวเลือก แต่เป็นตัวถูกดำเนินการ (เช่นอาร์กิวเมนต์ที่ไม่ใช่ตัวเลือก) ด้วยเหตุนี้การวาง--ก่อนที่จะไม่มีผลกระทบ รีบเป็นตัวถูกดำเนินการในและยังคงเป็นตัวถูกดำเนินการในcd - cd -- -เช่นเดียวกับยูทิลิตี้มาตรฐานอื่น ๆ ให้cdถือว่าตัวถูกดำเนินการเป็นตัวถูกดำเนินการโดยไม่คำนึงว่ามี--มาก่อน

คำสั่งกำหนดความหมายพิเศษที่จะถูกดำเนินการcd -สิ่งอื่นใดคือไดเรกทอรีที่จะสลับไปใช้ cd -- -aสลับไปยังไดเรกทอรีที่เรียกว่า-aเนื่องจาก-aไม่ใช่ตัวถูกดำเนินการพิเศษและการ--ป้องกันไม่ให้cdถือเป็นตัวเลือก สิ่งนี้ใช้ไม่ได้สำหรับ-คนเดียวซึ่งไม่ใช่ตัวเลือก

การใส่เครื่องหมายคำพูดรอบ ๆ-จะไม่ช่วยได้เพราะในที่สุดจะส่งผ่านตัวถูกดำเนินการ-ต่อไป

การขอความช่วยเหลือเพียงอย่างเดียวของคุณคือการค้นหาวิธีการแสดงความคิดเดียวกันอีกวิธีหนึ่งเช่นชื่ออื่นสำหรับไดเรกทอรีเดียวกัน โชคดีที่มีวิธีง่าย ๆ : ถ้าคุณเพิ่ม./ก่อนชื่อไฟล์ที่สัมพันธ์กันมันก็ยังหมายถึงไฟล์เดียวกัน ./ไม่สร้างความแตกต่างที่ไม่เกี่ยวข้องในกรณีของเรา: CDPATHไม่ได้รับการพิจารณาเมื่อชื่อไดเรกทอรีเริ่มต้นด้วย/, หรือ./ ../ดังนั้น:

cd ./-

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

cd -- -/

การเขียน-/ขอแนะนำให้ใช้โค้ดที่สมบูรณ์โดยวิธีการ แต่ในการทุบตีมันใช้ได้จริงกับ--ก่อนหน้าเท่านั้นการทุบตีไม่มีกรณีพิเศษสำหรับcd -/(zsh ทำ)


นั่นทำให้ฉันรู้สึกว่าฉันพยายามจริง ๆcd -- -/แต่เนื่องจากมีการทำงานที่เทียบเท่าcd -ก่อนหน้านั้นไดเรกทอรีจึงไม่มีอยู่จริงและฉันตีความว่ามันเป็นความพยายามที่ล้มเหลวอีกครั้ง
Der Hochstapler


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