Sử dụng {html,php,htm}
chỉ có thể làm việc như một mở rộng cú đúp , mà là một chuẩn (không phải POSIX-compliant) tính năng của bash
, ksh
và zsh
.
Để mở rộng dấu ngoặc nhọn được nhận dạng, nó phải là một mã thông báo (một phần của a) chưa được trích dẫn trên dòng lệnh.
Mở rộng dấu ngoặc nhọn mở rộng thành nhiều đối số , vì vậy trong trường hợp hiện tại, bạn grep
sẽ thấy nhiều --include=...
tùy chọn, giống như thể bạn đã chuyển chúng riêng lẻ.
Kết quả của việc mở rộng dấu ngoặc nhọn phụ thuộc vào việc mở rộng dấu nháy (mở rộng tên tệp) , có các cạm bẫy :
Mỗi đối số kết quả có thể được mở rộng hơn nữa thành các tên tệp phù hợp nếu nó xảy ra chứa các siêu ký tự hình cầu không được trích dẫn, chẳng hạn như *
.
Trong khi điều này là khó xảy ra với thẻ như --include=*.html
(ví dụ, bạn phải có một tập tin theo nghĩa đen tên là một cái gì đó giống như --include=foo.html
một cái gì đó để phù hợp), nó là giá trị lưu giữ trong tâm trí nói chung.
Nếu nullglob
tùy chọn shell được bật ( shopt -s nullglob
) và không khớp với gì , đối số sẽ bị loại bỏ .
Do đó, để có một giải pháp hoàn toàn mạnh mẽ , hãy sử dụng những cách sau:
grep -R '--include=*.'{html,php,htm} pattern /some/path
'--include=*.'
được coi là một nghĩa đen , do được trích dẫn đơn lẻ ; điều này ngăn cản việc giải thích một cách vô tình về *
một nhân vật lấp lánh.
{html,php,htm}
, - sự cần thiết - mở rộng dấu ngoặc nhọn [1]
, mở rộng thành 3 đối số, do {...}
trực tiếp theo sau '...'
mã thông báo , bao gồm mã thông báo đó.
Do đó, sau khi loại bỏ trích dẫn bằng shell, 3 đối số theo nghĩa đen sau đây cuối cùng được chuyển đến grep
:
--include=*.html
--include=*.php
--include=*.htm
[1] Chính xác hơn, chỉ những phần liên quan đến cú pháp của phần mở rộng dấu ngoặc nhọn mới phải được hủy trích dẫn, các phần tử danh sách vẫn có thể được trích dẫn riêng lẻ và phải được trích dẫn nếu chúng chứa các siêu ký tự hình cầu có thể dẫn đến nhấp nháy không mong muốn sau khi mở rộng dấu ngoặc nhọn; trong khi không cần thiết trong trường hợp này, phần trên có thể được viết là
'--include=*.'{'html','php','htm'}