Usando {html,php,htm}
só pode funcionar como uma expansão cinta , o que é uma característica fora do padrão (não compatíveis com POSIX) de bash
, ksh
e zsh
.
Para que uma expansão de chave seja reconhecida, ela deve ser um token sem aspas (parte de um) na linha de comando.
Uma expansão de chave se expande para vários argumentos , portanto, no caso em questão, grep
acaba vendo várias --include=...
opções, como se você as tivesse passado individualmente.
Os resultados de uma expansão de chave estão sujeitos a globbing (expansão de nome de arquivo) , que tem armadilhas :
Cada argumento resultante pode ser expandido para nomes de arquivo correspondentes se ele contiver metacaracteres globbing não citados, como *
.
Embora isso seja improvável com tokens como --include=*.html
(por exemplo, você teria que ter um arquivo com o nome literal de algo semelhante --include=foo.html
para que algo correspondesse), é importante ter em mente em geral.
Se a nullglob
opção shell for ativada ( shopt -s nullglob
) e globbing não corresponder a nada , o argumento será descartado .
Portanto, para uma solução totalmente robusta , use o seguinte:
grep -R '--include=*.'{html,php,htm} pattern /some/path
'--include=*.'
é tratado como literal , por estar entre aspas simples ; isso evita a interpretação inadvertida de *
um caractere globbing.
{html,php,htm}
, a - necessariamente - expansão de chaves sem aspas [1]
, expande-se para 3 argumentos, que, devido a {...}
seguir diretamente o '...'
token , incluem esse token.
Portanto, após a remoção da citação pelo shell, os três argumentos literais a seguir são finalmente transmitidos paragrep
:
--include=*.html
--include=*.php
--include=*.htm
[1] Mais precisamente, são apenas as partes relevantes à sintaxe da expansão da chave que devem ser não citadas, os elementos da lista ainda podem ser citados individualmente e devem ser se contiverem metacaracteres globbing que podem resultar em globbing indesejado após a expansão da chave; embora não seja necessário neste caso, o acima pode ser escrito como
'--include=*.'{'html','php','htm'}