Usando {html,php,htm}può funzionare solo come espansione tutore , che è un non standard (non POSIX) caratteristica bash, kshe zsh.
Affinché un'espansione di parentesi graffa venga riconosciuta, deve essere un token non quotato (parte di a) sulla riga di comando.
Un'espansione di parentesi graffa si espande a più argomenti , quindi nel caso in questione grepfinisce per vedere più --include=... opzioni, proprio come se le avessi passate singolarmente.
I risultati di un'espansione di parentesi graffe sono soggetti a globbing (espansione del nome del file) , che presenta delle insidie :
Ogni argomento risultante potrebbe essere ulteriormente espanso ai nomi di file corrispondenti se capita di contenere metacaratteri globbing non quotati come *.
Anche se questo è improbabile con token come --include=*.html(ad esempio, dovresti avere un file letteralmente chiamato qualcosa come --include=foo.htmlper far corrispondere qualcosa), vale la pena tenerlo a mente in generale.
Se l' nullglobopzione della shell è attivata ( shopt -s nullglob) e il globbing non corrisponde a nulla , l'argomento verrà scartato .
Pertanto, per una soluzione completamente robusta , utilizzare quanto segue:
grep -R '--include=*.'{html,php,htm} pattern /some/path
'--include=*.'è trattato come un letterale , perché è un apice singolo ; questo impedisce l'interpretazione involontaria di *come un personaggio globbing.
{html,php,htm}, l' espansione di parentesi graffa - di necessità - non quotata [1]
, si espande a 3 argomenti, che, a causa del {...} seguire direttamente il '...'token , includono quel token.
Pertanto, dopo la rimozione delle virgolette dalla shell, i seguenti 3 argomenti letterali vengono infine passati agrep :
--include=*.html
--include=*.php
--include=*.htm
[1] Più precisamente, sono solo le parti rilevanti per la sintassi dell'espansione delle parentesi graffe che devono essere non quotate , gli elementi della lista possono ancora essere citati individualmente e devono esserlo se contengono metacaratteri globbing che potrebbero provocare un globbing indesiderato dopo l'espansione della parentesi graffa; sebbene non sia necessario in questo caso, quanto sopra potrebbe essere scritto come
'--include=*.'{'html','php','htm'}