อะไรคือความแตกต่างระหว่าง:
grep "string" . -r --include *.pl
และ
grep "string" . -r --include "*.pl"
หลังรวมถึงไฟล์ในไดเรกทอรีย่อยในขณะที่อดีตไม่ ทำไม?
อะไรคือความแตกต่างระหว่าง:
grep "string" . -r --include *.pl
และ
grep "string" . -r --include "*.pl"
หลังรวมถึงไฟล์ในไดเรกทอรีย่อยในขณะที่อดีตไม่ ทำไม?
คำตอบ:
*(ดาวหรือดอกจัน) เป็นตัวละครพิเศษซึ่งเป็น (ปกติ) ตีความโดยเปลือกก่อนที่มันจะได้รับคำสั่ง มันคือ (ปกติ) ขยายไปยังชื่อไฟล์ทั้งหมดยกเว้นที่มีจุดนำ ดูคู่มือทุบตีเกี่ยวกับการจับคู่รูปแบบสำหรับข้อมูลเพิ่มเติม
หากอยู่ในเครื่องหมายคำพูดดาวจะไม่ถูกตีความโดยเชลล์และมอบให้กับคำสั่งคำต่อคำ
ตัวอย่างอธิบาย หนึ่งที่ยกมา:
grep "string" . -r --include "*.pl"
ที่นี่grepจะได้รับตัวเลือกที่มีการโต้แย้ง--include *.plนั่นคือสตริงอักขระ 4 ตัวที่มี*อักขระเป็นอักขระตัวแรก สิ่งที่grepทำกับสตริงนั้นขึ้นอยู่กับgrepทั้งหมด ในกรณีนี้หมายถึงการพิจารณาเฉพาะไฟล์ที่ตรงกับรูปแบบ--include*.pl
AFAIK เบื้องหลัง gnu grep ใช้รูปแบบการจับคู่แบบเดียวกับ gnu bash
คนที่ไม่ยกมา:
grep "string" . -r --include *.pl
ที่นี่เชลล์จะขยายรูปแบบ*.plไปยังชื่อไฟล์ทั้งหมดที่ลงท้าย.plด้วย สมมติว่ามีไฟล์foo.pl, และbar.pl baz.plหลังจากขยายบรรทัดคำสั่งจะมีลักษณะดังนี้:
grep "string" . -r --include foo.pl bar.pl baz.pl
ที่นี่grepจะได้รับตัวเลือก--includeที่มีการโต้แย้งfoo.plตามด้วยตัวเลือกและbar.pl วิธีการที่จะพิจารณาเฉพาะไฟล์ที่ตรงกับรูปแบบ เนื่องจากไม่มีสัญลักษณ์ในรูปแบบที่ตรงกับแฟ้มเท่านั้นที่จะเป็นไฟล์ที่ชื่อว่าbaz.pl--include foo.plfoo.plfoo.pl
ตัวเลือกbar.plและbaz.plหมายความว่า grep จะค้นหาไฟล์เหล่านั้นด้วยเช่นกัน แต่เนื่องจากไฟล์เหล่านั้นไม่ตรงกับรูปแบบfoo.plจึงจะถูกละเว้น
grep -rดูเหมือนไม่สอดคล้องกัน *แต่ไม่เคยสังเกตเห็นมันเป็นเพียงเมื่อฉันใช้
ความแตกต่างคือถ้าคุณไม่ได้พูดรูปแบบ ( *.pl) มันจะขยายตัวโดยเปลือก ตัวอย่างเช่นหากคุณเรียกใช้ของคุณgrepในไดเรกทอรีที่มีไฟล์ชื่อfoo.plเนื่องจาก*plถูกขยายโดยเชลล์สิ่งที่grepเห็นจริงคือ:
grep "string" . -r --include foo.pl
เนื่องจากคุณบอกให้รวมfoo.plเท่านั้นจะค้นหาผ่านไฟล์เดียวเท่านั้น
หากคุณพูดถึงรูปแบบของคุณเชลล์จะไม่ขยายและgrepรับคำสั่งที่ถูกต้องคือ
grep "string" . -r --include *pl
peopl*.plจะไม่ได้รับการขยายตัว
grep; มันอยู่ในเปลือกgrepไม่เคยเห็นคำพูด