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 grep
sẽ nhận được tùy chọn --include
với đối số *.pl
. Đó là chuỗi 4 ký tự với *
ký tự là ký tự đầu tiên. Những gì grep
làm với chuỗi đó là hoàn toàn lên đến grep
. Trong trường hợp này --include
có 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 *.pl
cho 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.pl
và 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 grep
sẽ nhận được tùy chọn --include
với đối số foo.pl
, tiếp theo là các tùy chọn bar.pl
và baz.pl
. --include foo.pl
có 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.pl
và baz.pl
phươ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.pl
nên chúng sẽ bị bỏ qua.
grep -r
có 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 grep
trong 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 grep
thực sự nhìn thấy là:
grep "string" . -r --include foo.pl
Vì bạn bảo nó chỉ bao gồm foo.pl
nê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à grep
nhận lệnh chính xác, cụ thể là
grep "string" . -r --include *pl
peopl
sẽ không được mở rộng bởi *.pl
.
grep
; nó ở trong vỏ.grep
không bao giờ nhìn thấy các trích dẫn.