Usando {html,php,htm}
sólo puede funcionar como una expansión de llaves , que es un no estándar (no compatible con POSIX) característica de bash
, ksh
y zsh
.
En otras palabras: no intente usarlo en un script que tenga como objetivo /bin/sh
, use múltiples argumentos explícitos--include
en ese caso.
grep
en sí mismo no comprende la {...}
notación.
Para que se reconozca una expansión de llaves, debe ser un token sin comillas (parte de a) en la línea de comando.
Una expansión de llaves se expande a múltiples argumentos , por lo que, en el caso que nos ocupa, grep
termina viendo múltiples --include=...
opciones, como si las hubiera pasado individualmente.
Los resultados de una expansión de llaves están sujetos a globbing (expansión de nombre de archivo) , que tiene dificultades :
Cada argumento resultante podría expandirse aún más a nombres de archivo coincidentes si contiene metacaracteres globales sin comillas como *
.
Si bien esto es poco probable con tokens como --include=*.html
(por ejemplo, tendría que tener un archivo con un nombre literalmente similar --include=foo.html
para que algo coincida), vale la pena tenerlo en cuenta en general.
Si la nullglob
opción de shell está activada ( shopt -s nullglob
) y el globbing no coincide con nada , el argumento se descartará .
Por lo tanto, para una solución completamente robusta , use lo siguiente:
grep -R '--include=*.'{html,php,htm} pattern /some/path
'--include=*.'
se trata como literal , debido a que está entre comillas simples ; esto evita la interpretación inadvertida de *
un carácter globular.
{html,php,htm}
, la - por necesidad - expansión de llaves sin comillas [1]
, se expande a 3 argumentos que, debido a {...}
que siguen directamente al '...'
token , incluyen ese token.
Por lo tanto, después de que el shell elimine las comillas, los siguientes 3 argumentos literales se pasan finalmente agrep
:
--include=*.html
--include=*.php
--include=*.htm
[1] Más exactamente, son solo las partes relevantes para la sintaxis de la expansión de llaves las que deben estar sin comillas, los elementos de la lista aún pueden estar entrecomillados individualmente y deben serlo si contienen metacaracteres globbing que podrían resultar en globbing no deseado después de la expansión de llaves; aunque no es necesario en este caso, lo anterior podría escribirse como
'--include=*.'{'html','php','htm'}