เครื่องหมายคำถามในคำสั่งเทอร์มินัลหมายถึงอะไร


11

คำถามนี้ ( ฉันจะลบ gnome ออกจากการติดตั้ง kubuntu 12.04 ได้อย่างไร ) มีคำสั่งพร้อมเครื่องหมายคำถาม:

sudo apt-get remove --purge ubuntu-desktop
sudo apt-get remove --purge unity?
sudo apt-get remove --purge gnome?

พวกเขาหมายถึงอะไร?

คำตอบ:


15

สิ่งเหล่านี้เรียกว่าสัญลักษณ์แทน (รูปแบบกลม)

อักขระตัวแทนมาตรฐาน (หรือที่เรียกว่ารูปแบบการวนซ้ำ) ถูกใช้โดยโปรแกรมอรรถประโยชน์บรรทัดคำสั่งต่าง ๆ เพื่อทำงานกับไฟล์หลายไฟล์
อักขระตัวแทนมาตรฐานใช้งานเกือบทุกคำสั่ง (รวมถึง mv, cp, rm และอื่น ๆ อีกมากมาย)

  • (question mark)

    สิ่งนี้สามารถแสดงถึงอักขระเดี่ยวใด ๆ หากคุณระบุบางอย่างในบรรทัดคำสั่งเช่น "hd?" GNU / Linux จะมองหา hda, hdb, hdc และตัวอักษร / ตัวเลขอื่น ๆ ทุกตัวระหว่าง az, 0-9

  • *(asterisk)

    สิ่งนี้สามารถแสดงจำนวนอักขระใด ๆ (รวมถึงศูนย์ในคำอื่น ๆ ศูนย์หรือมากกว่าตัวอักษร) หากคุณระบุ "cd *" มันจะใช้ "cda", "cdrom", "cdrecord" และทุกอย่างที่ขึ้นต้นด้วย“ cd” รวมถึง“ cd” ด้วย "m * l" ทำได้โดยการบด, mull, ml, และอะไรก็ได้ที่เริ่มต้นด้วย m และลงท้ายด้วย l

  • [ ] (square brackets)

    ระบุช่วง ถ้าคุณทำ m [a, o, u] m มันจะกลายเป็น: mam, mum, mom ถ้าคุณทำ: m [ad] m มันจะกลายเป็นอะไรก็ได้ที่เริ่มต้นและสิ้นสุดด้วย m และมีตัวอักษร a ถึง d อยู่ระหว่าง ตัวอย่างเช่นสิ่งเหล่านี้จะใช้ได้: mam, mbm, mcm, mdm อักขระตัวแทนชนิดนี้ระบุความสัมพันธ์“ หรือ” (คุณต้องการเพียงหนึ่งรายการที่ตรงกัน)

  • { } (curly brackets)

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


ตัวอย่างเช่นสิ่งนี้จะถูกต้อง:

  • cp { .doc, .pdf} ~

    สิ่งนี้จะคัดลอกสิ่งที่ลงท้ายด้วย. doc หรือ. pdf ไปยังโฮมไดเร็กตอรี่ของผู้ใช้ โปรดทราบว่าไม่อนุญาตให้ใช้ช่องว่างหลังเครื่องหมายจุลภาค (หรือที่อื่น)

  • [!]

    โครงสร้างนี้คล้ายกับโครงสร้าง [] ยกเว้นแทนที่จะจับคู่อักขระใด ๆ ภายในวงเล็บเหลี่ยมมันจะจับคู่อักขระใด ๆ ตราบใดที่มันไม่ได้อยู่ในรายการระหว่าง [และ] นี่คือตรรกะไม่ ตัวอย่างเช่น rm myfile [! 9] จะลบ myfiles ทั้งหมด * (เช่น myfiles1, myfiles2 เป็นต้น) แต่จะไม่ลบไฟล์ที่มีหมายเลข 9 ที่ใดก็ได้ภายในชื่อ

  • \ (backslash)

    ใช้เป็นอักขระ "หลบหนี" เช่นเพื่อป้องกันอักขระพิเศษที่ตามมา ดังนั้น "\" จะค้นหาเครื่องหมายแบ็กสแลชหมายเหตุคุณอาจต้องใช้เครื่องหมายคำพูดและแบ็กสแลช (es)

สำหรับตัวอย่างเพิ่มเติม: เยี่ยมชมหน้านี้


3
เป็นมูลค่าการกล่าวขวัญว่าapt-get removeต้องใช้ชื่อแพคเกจไม่ใช่ชื่อไฟล์ซึ่งทำให้การขยายตัวสัญลักษณ์แทนโดยเชลล์ส่วนใหญ่ไร้ประโยชน์ หากคุณต้องการลบช่วงของแพคเกจที่คุณต้องการใช้การแสดงออกปกติเต็มรูปแบบที่ยกมาอย่างเหมาะสมเพื่อป้องกันไม่ให้เปลือกจากความพยายามที่จะตีความมันเป็นกลม (เช่นapt-get remove 'gnome.*')

4
Standard wildcards are used by nearly any command (including mv, cp, rm and many others).=> FALSE อักขระตัวแทนเหล่านี้กำลังถูกขยายโดยเชลล์และสิ่งที่คำสั่งที่ได้รับคือผลลัพธ์ของการขยาย (เช่นไฟล์ที่ตรงกับรูปแบบ) แทนรูปแบบ (หากไม่มีไฟล์ใดที่ตรงกับรูปแบบแล้วรูปแบบนั้นจะถูกส่งโดยตรงไปยังคำสั่ง)
Carlos Campderrós

17

โดยทั่วไปแล้วใน Bash a ?เป็นรูปแบบแบบกลมที่ขยายไปถึงตัวละครโดยพลการ

ตัวอย่างเช่น:

$ echo Hello1 > foo1
$ echo Hello2 > foo2
$ cat foo?
Hello1
Hello2

มันคล้ายกับ a *แต่*ขยายเป็น0 หรือมากกว่าตัวอักษรในขณะที่?ขยายเป็นอักขระหนึ่งตัว (ตามอำเภอใจ)

ในกรณีพิเศษของคุณแม้ว่า?คำสั่งในคำสั่งจะพิมพ์ผิด


ในกรณีของฉันมันไร้ประโยชน์ / ไม่จำเป็นใช่ไหม?
Ooker

ใช่. ในความเป็นจริงมันถูกแก้ไขจากคำตอบที่คุณเชื่อมโยงเมื่อคุณถามคำถาม :)
Malte Skoruppa

1
ไม่อยากเชื่อเลย: -o
Ooker

1
แม้ว่าจะเป็น wildcard ที่ถูกต้องก็ตามการใช้งานนี้ควรหลีกเลี่ยงโดยไม่ต้องแจ้งให้ทราบ apt-get เข้าใจ REs แต่ถ้าไฟล์ที่เรียกว่าgnome1มีอยู่ในไดเรกทอรีปัจจุบันเชลล์จะขยายออกก่อนที่ apt-get จะมีโอกาสเห็นมัน
Rmano

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