อะไรคือความแตกต่างระหว่าง“ * .pl” และ * .pl ใน grep? ทำไมการอ้างถึงเปลี่ยนผลลัพธ์?


10

อะไรคือความแตกต่างระหว่าง:
grep "string" . -r --include *.pl

และ

grep "string" . -r --include "*.pl"

หลังรวมถึงไฟล์ในไดเรกทอรีย่อยในขณะที่อดีตไม่ ทำไม?


ความแตกต่างไม่ได้อยู่ในgrep; มันอยู่ในเปลือก grepไม่เคยเห็นคำพูด
สัญลักษณ์แทน

คำตอบ:


17

*(ดาวหรือดอกจัน) เป็นตัวละครพิเศษซึ่งเป็น (ปกติ) ตีความโดยเปลือกก่อนที่มันจะได้รับคำสั่ง มันคือ (ปกติ) ขยายไปยังชื่อไฟล์ทั้งหมดยกเว้นที่มีจุดนำ ดูคู่มือทุบตีเกี่ยวกับการจับคู่รูปแบบสำหรับข้อมูลเพิ่มเติม

หากอยู่ในเครื่องหมายคำพูดดาวจะไม่ถูกตีความโดยเชลล์และมอบให้กับคำสั่งคำต่อคำ


ตัวอย่างอธิบาย หนึ่งที่ยกมา:

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ดูเหมือนไม่สอดคล้องกัน *แต่ไม่เคยสังเกตเห็นมันเป็นเพียงเมื่อฉันใช้
j883376

6

ความแตกต่างคือถ้าคุณไม่ได้พูดรูปแบบ ( *.pl) มันจะขยายตัวโดยเปลือก ตัวอย่างเช่นหากคุณเรียกใช้ของคุณgrepในไดเรกทอรีที่มีไฟล์ชื่อfoo.plเนื่องจาก*plถูกขยายโดยเชลล์สิ่งที่grepเห็นจริงคือ:

grep "string" . -r --include foo.pl

เนื่องจากคุณบอกให้รวมfoo.plเท่านั้นจะค้นหาผ่านไฟล์เดียวเท่านั้น

หากคุณพูดถึงรูปแบบของคุณเชลล์จะไม่ขยายและgrepรับคำสั่งที่ถูกต้องคือ

 grep "string" . -r --include *pl

peopl*.plจะไม่ได้รับการขยายตัว
unxnut

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