Usando {html,php,htm}
può funzionare solo come espansione tutore , che è un non standard (non POSIX) caratteristica bash
, ksh
e 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 grep
finisce 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.html
per far corrispondere qualcosa), vale la pena tenerlo a mente in generale.
Se l' nullglob
opzione 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'}