ทำไมเสียงก้องจับคู่ไฟล์บางไฟล์สองครั้ง?


11
$ touch file{1..12}

$ echo *e{1..12}
file1 file2 file3 file4 file5 file6 file7 file8 file9 file10 file11 file12

$ echo *{1..12}
file1 file11 file12 file2 file3 file4 file5 file6 file7 file8 file9 file10 file11 file12

ฉันไม่เข้าใจว่าทำไมสิ่งนี้จึงเกิดขึ้น กรุณาช่วยอธิบายหน่อยได้ไหม

คำตอบ:


21

เครื่องมือจัดฟันไม่ใช่รูปแบบสัญลักษณ์แทน ตรวจสอบเอกสารประกอบของการขยาย bash : การจัดฟันจะถูกขยายเร็วมากในกระบวนการและรูปแบบไวด์การ์ดจะถูกขยายในขั้นตอนสุดท้าย¹

เริ่มแรกคำสั่งประกอบด้วยสองคำecho, *{1..12}. หลังจากที่ขยายตัวรั้งคำสั่งมี 13 คำ: echo, *1, *2, ... *12, จากนั้นรูปแบบไวด์การ์ดจะถูกขยาย *1ขยายไปยังรายชื่อไฟล์ที่ลงท้ายด้วย1ซึ่งรวมถึงไม่เพียงfile1แต่ยังfile11(ซึ่งจะเรียงลำดับตามลำดับในพจนานุกรม) เช่นเดียวกัน*2ขยายไปถึงfile12และfile2(ตามลำดับนี้) ดังนั้นคุณจะได้รับecho, file1, file11, file12, file2และจากนั้นสัญลักษณ์อื่น ๆ ที่ตรงกับไฟล์เดียว: file3, file4, ... file12,

¹ ถัดจากครั้งสุดท้ายหากคุณทำตามคำอธิบายของคู่มือ แต่“ การลบเครื่องหมายคำพูด” นั้นไม่ใช่เรื่องจริงเลย - การแยกคำพูดนั้นเร็วกว่ากระบวนการขยาย

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