Câu trả lời:
Các *(sao, hoặc dấu hoa thị) là một nhân vật đặc biệt được (thường) giải thích bằng vỏ trước khi nó được đưa ra lệnh. Nó (thường) được mở rộng cho tất cả các tên tệp ngoại trừ những tên có dấu chấm hàng đầu. Xem hướng dẫn bash về khớp mẫu để biết thêm thông tin.
Nếu được đặt trong dấu ngoặc kép, ngôi sao sẽ không được giải thích bởi shell và được trao cho nguyên văn lệnh.
Ví dụ giải thích. Một trích dẫn:
grep "string" . -r --include "*.pl"
Ở đây grepsẽ nhận được tùy chọn --includevới đối số *.pl. Đó là chuỗi 4 ký tự với *ký tự là ký tự đầu tiên. Những gì greplàm với chuỗi đó là hoàn toàn lên đến grep. Trong trường hợp này --includecó nghĩa là chỉ xem xét các tệp phù hợp với mẫu *.pl.
AFAIK đằng sau hậu trường gnu grep sử dụng cùng một mô hình phù hợp với lib như gnu bash.
Không được trích dẫn một:
grep "string" . -r --include *.pl
Ở đây, vỏ đầu tiên sẽ mở rộng mô hình *.plcho tất cả các tên tệp kết thúc bằng .pl. Giả sử có các tập tin foo.pl, bar.plvà baz.pl. Sau khi mở rộng dòng lệnh trông như thế này:
grep "string" . -r --include foo.pl bar.pl baz.pl
Ở đây grepsẽ nhận được tùy chọn --includevới đối số foo.pl, tiếp theo là các tùy chọn bar.plvà baz.pl. --include foo.plcó nghĩa là chỉ xem xét các tập tin phù hợp với mẫu foo.pl. Vì không có ký tự đại diện trong mẫu nên tệp duy nhất khớp sẽ là tệp có tên foo.pl.
Các tùy chọn bar.plvà baz.plphương tiện grep cũng sẽ tìm kiếm trong các tệp đó, nhưng vì chúng không khớp với mẫu foo.plnên chúng sẽ bị bỏ qua.
grep -rcó vẻ không nhất quán nhưng không bao giờ nhận thấy nó chỉ khi tôi sử dụng a *.
Sự khác biệt là nếu bạn không trích dẫn mẫu ( *.pl) thì nó được mở rộng bằng vỏ. Ví dụ: nếu bạn chạy greptrong thư mục chứa tệp được gọi foo.pl, vì tệp *plđược mở rộng bởi trình bao, điều grepthực sự nhìn thấy là:
grep "string" . -r --include foo.pl
Vì bạn bảo nó chỉ bao gồm foo.plnên nó sẽ chỉ tìm kiếm thông qua một tệp đó.
Nếu bạn trích dẫn mẫu của mình, trình bao sẽ không mở rộng nó và grepnhận lệnh chính xác, cụ thể là
grep "string" . -r --include *pl
peoplsẽ không được mở rộng bởi *.pl.
grep; nó ở trong vỏ.grepkhông bao giờ nhìn thấy các trích dẫn.