tl;dr
# Works in bash, ksh, and zsh.
grep -R '--include=*.'{html,php,htm} pattern /some/path
Utilisation {html,php,htm}
ne peut fonctionner qu'en tant que expansion de l'orthèse qui est une fonctionnalité non standard (non conforme à POSIX) de la norme bash
, ksh
y zsh
.
Pour qu'une extension d'accolade soit reconnue, elle doit doit être un non cotée (partie d'un) jeton sur la ligne de commande.
Expansion de l'orthèse s'étend à arguments multiples Ainsi, dans le cas présent grep
finit par voir multiples --include=...
options comme si vous les aviez passés individuellement.
Les résultats d'une expansion d'accolade sont soumis au globbing (expansion du nom de fichier) qui a pièges :
-
Chaque argument résultant peut être étendu à des noms de fichiers correspondants s'il contient non cotée les métacaractères de globalisation tels que *
.
Bien que cela soit peu probable avec des jetons tels que le --include=*.html
(par exemple, vous devez disposer d'un fichier littéralement nommée quelque chose comme --include=foo.html
pour trouver quelque chose qui corresponde), il vaut la peine de garder cela à l'esprit en général.
-
Si le nullglob
est activée ( shopt -s nullglob
) et les correspondances globales rien l'argument sera mis au rebut .
Par conséquent, pour les une solution entièrement robuste utiliser ce qui suit :
grep -R '--include=*.'{html,php,htm} pattern /some/path
-
'--include=*.'
est traité comme un littéral , du fait qu'il s'agit d'une entre guillemets ; cela permet d'éviter une interprétation involontaire des *
en tant que caractère de globalisation.
-
{html,php,htm}
, le - par nécessité - non cotée expansion de l'orthèse [1] s'étend à 3 des arguments qui, en raison de la {...}
directement à la suite de la '...'
jeton , inclure ce jeton.
-
Par conséquent, après l'enlèvement des citations par la coquille, les suivants 3 littéral sont finalement transmis à grep
:
--include=*.html
--include=*.php
--include=*.htm
[1] Plus précisément, il s'agit seulement de la pertinent pour la syntaxe les parties de l'expansion de l'accolade qui doivent être non citées, le éléments de la liste peuvent toujours être cités individuellement et doivent l'être s'ils contiennent des métacaractères de globalisation qui pourraient entraîner une globalisation non désirée après l'expansion de l'accolade ; bien que cela ne soit pas nécessaire dans ce cas, ce qui précède pourrait être écrit sous la forme suivante
'--include=*.'{'html','php','htm'}