อะไรคือความแตกต่างระหว่าง:
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.pl
foo.pl
foo.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
ไม่เคยเห็นคำพูด