อะไรคือข้อแตกต่างระหว่าง ls [13] และ ls {1,3}


11

touch inv{1..3}.txtฉันสร้างสามไฟล์ในไดเรกทอรีของฉันโดยใช้คำสั่ง ตอนนี้ฉันใช้คำสั่งสองคำสั่งและเอาต์พุตของพวกเขาก็เหมือนกันมาก คำสั่งทั้งสองนั้นคือls inv[13].txtและls {1,3}.txt.

แล้วสองคนนี้ต่างกันอย่างไร วงเล็บเหลี่ยมแตกต่างกันอย่างไรเมื่อเปรียบเทียบกับเครื่องมือจัดฟัน นอกจากนี้ฉันยังได้ค้นหาคำว่า "linux [.. ]" แต่ไม่พบอะไรเลยฉันจึงรู้ได้ว่าสิ่งเหล่านี้เรียกว่าอะไรในคำศัพท์ของ linux?

ขอบคุณ


2
ชื่อนี้คือ "การขยายชื่อไฟล์" หรือ "globbing"
ผู้บัญชาการ Byte

ข้อใดต่อไปนี้คือการขยายหรือตั้งชื่อไฟล์? เป็นวงเล็บเหลี่ยม ([.. ]) หรือวงเล็บดอกไม้ ({.. }) หรือไม่
posixKing

คำตอบ:


14
  • {}เรียกว่าการขยายรั้ง มันมีสองรูปแบบ: {x..y}และ{x,y}แทนที่xและyมีค่าตัวอักษรหรือตัวเลขใด ๆ

    ในรูปแบบแรก{x..y}จะถูกขยายเป็นค่าทั้งหมดจากxถึงyรวม ยกตัวอย่างเช่น{2..5}จะขยายไป2, 3, ,45

    ในรูปแบบที่ชัดเจนที่สอง{x,y}จะขยายไปเพียง,x yยกตัวอย่างเช่น{2,5}จะขยายไปและ25

    {a..3}ถ้าไม่มีการขยายตัวเป็นไปได้รูปแบบที่ได้รับการปฏิบัติอย่างแท้จริงเช่นใน

    สิ่งสำคัญที่ควรทราบคือการขยายรั้งจะทำ (ถ้าเป็นไปได้) โดยไม่คำนึงถึงการจับคู่ไฟล์ใด ๆ ในขณะที่อยู่ในการสร้าง / การจับคู่ไฟล์

  • []เรียกว่ารูปแบบการขยายชื่อพา ธ (หรือกลม) ซึ่งแตกต่างจากการขยายรั้งคุณสามารถใช้งานได้เฉพาะในขณะที่การจับคู่ชื่อไฟล์มันจะได้รับการปฏิบัติอย่างแท้จริงถ้าคุณใช้มันในขณะที่สร้างไฟล์

    มันมีอยู่สองรูปแบบ: และ[xyz...][x-y]

    ในรูปแบบแรกมันจะจับคู่อักขระเดี่ยวใด ๆ ภายในวงเล็บเหลี่ยมแยก Ie อักขระแต่ละตัวจะได้รับการปฏิบัติแยกกัน ดังนั้น[25].txtมันจะตรงกับไฟล์ชื่อ2.txtหรือ5.txtในไดเรกทอรีปัจจุบันในขณะที่สำหรับ[245].txtมันจะตรงกับชื่อไฟล์ใด ๆ2.txtหรือหรือ4.txt5.txt

    ในรูปแบบที่สองการขยายช่วงจะกระทำก่อนที่จะจับคู่ทีละรายการหากเป็นไปได้ ดังนั้น[2-5]. txtมันจะตรงกับชื่อไฟล์ใด ๆ2.txtหรือ3.txtหรือหรือ4.txt ถ้าช่วงที่ไม่สามารถขยายตัวก็จะได้รับการปฏิบัติอย่างแท้จริงเช่นในกรณีของ5.txt[a-3].txt


ความแตกต่างด้านพฤติกรรมที่สำคัญระหว่างสองสิ่งนี้คือเมื่อมีรูปแบบการจับคู่มากกว่าขณะที่จับคู่น้อยลงจริง ๆ เนื่องจากการขยายส่วนปีกกาจะทำไม่ว่าจะเกิดอะไรขึ้นมันจะแสดงข้อผิดพลาดว่าไม่มีไฟล์บางไฟล์ในขณะที่การขยายชื่อพา ธ จะตรงกับสิ่งที่เป็นไปได้โดยไม่มีข้อผิดพลาดสำหรับส่วนที่เหลือ:

$ ls {1..4}.txt
ls: cannot access 4.txt: No such file or directory
1.txt  2.txt  3.txt

$ ls [1-4].txt
1.txt  2.txt  3.txt

หมายเหตุการพกพา:

[]ผู้ประกอบการขยายตัวชื่อพา ธ จะถูกกำหนดโดย POSIX จึงพกพาหมู่เปลือกบอร์นและอนุพันธ์

การขยายรั้ง, {}ไม่ได้ถูกกำหนดโดย POSIX ดังนั้นจึงไม่สามารถพกพาได้ในทุกเชลล์ ตัวอย่างเช่น dash( shใน Ubuntu) ไม่มีสิ่งนี้ มันถูกยืมมาจากcshและจะทำงานบนเปลือกหอยบางอย่างเท่านั้นเช่นbash, zsh, ,ksh93 fishตรวจสอบให้แน่ใจว่าเชลล์ที่คุณใช้รองรับสิ่งนี้ก่อนนำไปใช้


ตัวอย่าง:

$ touch {1..3}.txt

$ ls {1..3}.txt
1.txt  2.txt  3.txt

$ ls {1,2,3}.txt
1.txt  2.txt  3.txt

$ ls {1..4}.txt
ls: cannot access 4.txt: No such file or directory
1.txt  2.txt  3.txt

$ ls {a..3}.txt
ls: cannot access {a..3}.txt: No such file or directory

$ ls [123].txt
1.txt  2.txt  3.txt

$ ls [1-3].txt
1.txt  2.txt  3.txt

$ ls [1-4].txt
1.txt  2.txt  3.txt

$ ls [a-3].txt
ls: cannot access [a-3].txt: No such file or directory

1
หนึ่งควรหลีกเลี่ยงการพึ่งพาพฤติกรรมการ[ ]ขยายตัวเมื่อไม่มีการจับคู่เพราะอาจแตกต่างกันขึ้นอยู่กับการกำหนดค่าเปลือก หากคุณต้องการที่จะใช้[หรือ]ในชื่อไฟล์มันควรจะยกมาในคำสั่งของคุณ นอกจากนี้ยังเป็นมูลค่าสังเกตเห็นความแตกต่างระหว่างและ{13..79} [13-79]เป็นครั้งแรกที่จะผลิตตัวเลขทั้งหมดในช่วงจาก13การ79ที่สองจะตรงกับตัวละคร1, 3, 4, 5, 6, และ7 9
kasperd

@kasperd ใช่นั่นคือสิ่งที่nullglob(หรือคล้ายกัน) สำหรับ เกี่ยวกับการ[13-79]จับคู่ฉันคิดว่าฉันพูดอย่างชัดเจนในคำตอบของฉันเกี่ยวกับพฤติกรรมต่อตัวละครของ [] `
heemayl

@ heemayl ฉันคิดว่ามันจะคุ้มค่าที่จะกล่าวถึงว่ารูปแบบ `{1..3} 'นั้นเป็นเรื่องน่าเบื่อหน่าย สิ่งนี้จะไม่ทำงานในเส้นประ ฉันคิดว่าkshมีคุณสมบัตินี้ แต่ไม่ใช่รสชาติที่ทันสมัยกว่าเช่น mksh และ pkdsh
Sergiy Kolodyazhnyy

@Serg เพิ่มบันทึกการพกพา
heemayl

7

ความแตกต่างที่สำคัญระหว่างสองรูปแบบมีภาพประกอบที่นี่:

$ ls inv[15].txt
inv1.txt
$ ls inv{1,5}.txt
ls: cannot access 'inv5.txt': No such file or directory
inv1.txt

inv[15].txtเป็น glob และจะขยายรายการของไฟล์ที่ตรงกันในระบบไฟล์ของคุณ นี่คือการขยายตัวของพา

inv{1,5}.txtขยายไปถึงinv1.txtและinv5.txtโดยไม่คำนึงว่าไฟล์ใดในระบบไฟล์ของคุณ นี่คือการขยายตัวรั้ง


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