ใช้{html,php,htm}
เพียงสามารถทำงานเป็นขยายตัวรั้งซึ่งเป็นมาตรฐานคุณลักษณะ (ไม่ POSIX สอดคล้อง) ของbash
, และksh
zsh
สำหรับการขยายตัวรั้งที่จะได้รับการยอมรับก็ต้องเป็นunquoted (ส่วนหนึ่งของ) tokenในบรรทัดคำสั่ง
การขยายวงเล็บปีกกาจะขยายไปยังอาร์กิวเมนต์หลายตัวดังนั้นในกรณีที่อยู่ในมือgrep
จะเห็นหลาย --include=...
ตัวเลือกเหมือนกับว่าคุณส่งผ่านทีละข้อ
ผลลัพธ์ของการขยายวงเล็บปีกกาขึ้นอยู่กับ globbing (การขยายชื่อไฟล์)ซึ่งมีข้อผิดพลาด :
แต่ละข้อโต้แย้งที่เกิดสามารถต่อขยายได้ถึงชื่อไฟล์ที่ตรงกันถ้ามันเกิดขึ้นจะมีunquoted metacharacters globbing *
เช่น
แม้ว่าสิ่งนี้จะไม่น่าเกิดขึ้นกับโทเค็นเช่น--include=*.html
(เช่นคุณต้องมีไฟล์ที่ตั้งชื่อตามตัวอักษรเช่น--include=foo.html
เพื่อให้ตรงกัน) แต่ก็ควรคำนึงถึงโดยทั่วไป
ถ้าnullglob
ตัวเลือกเปลือกเกิดขึ้นจะเปิด ( shopt -s nullglob
) และ globbing การแข่งขันอะไรอาร์กิวเมนต์จะถูกทิ้ง
ดังนั้นสำหรับโซลูชันที่มีประสิทธิภาพเต็มที่ให้ใช้สิ่งต่อไปนี้:
grep -R '--include=*.'{html,php,htm} pattern /some/path
'--include=*.'
จะถือว่าเป็นตัวอักษรเนื่องจากจะเป็นคนเดียวที่ยกมา ; สิ่งนี้จะป้องกันการตีความโดยไม่ได้ตั้งใจ*
ว่าเป็นตัวละครที่มีลักษณะกลม
{html,php,htm}
ที่ - ความจำเป็น - unquotedขยายตัวรั้ง[1]
, ขยายไป3ข้อโต้แย้งที่เกิดจากการ{...}
โดยตรงต่อไปนี้'...'
โทเค็น , รวมถึงโทเค็นว่า
ดังนั้นหลังจากลบเครื่องหมายคำพูดโดยเชลล์แล้วอาร์กิวเมนต์ตัวอักษร3 ตัวต่อไปนี้จะถูกส่งไปยัง grep
:
--include=*.html
--include=*.php
--include=*.htm
[1] แม่นยำยิ่งขึ้นเป็นเพียงส่วนที่เกี่ยวข้องกับไวยากรณ์ของการขยายวงเล็บปีกกาเท่านั้นที่ต้องไม่ใส่เครื่องหมายคำพูดองค์ประกอบรายการอาจยังคงถูกยกมาทีละรายการและต้องเป็นหากองค์ประกอบเหล่านี้มีอักขระเมตาชาร์กที่อาจทำให้เกิดการโกลว์ที่ไม่ต้องการหลังจากการขยายวงเล็บปีกกา ในขณะที่ไม่จำเป็นในกรณีนี้สามารถเขียนข้างต้นเป็น
'--include=*.'{'html','php','htm'}