L' utilisation {html,php,htm}
ne peut fonctionner comme une expansion des accolades , ce qui est une caractéristique de non standard (non-conforme aux spécifications POSIX) bash
, ksh
et zsh
.
Pour qu'une extension d'accolade soit reconnue, il doit s'agir d'un jeton non guillemet (partie d'un) sur la ligne de commande.
Une extension d'accolade se développe en plusieurs arguments , donc dans le cas présent grep
finit par voir plusieurs --include=...
options, comme si vous les aviez passées individuellement.
Les résultats d'une expansion d'accolades sont sujets au globbing (expansion du nom de fichier) , qui présente des pièges :
Chaque argument résultant peut être étendu aux noms de fichiers correspondants s'il contient des métacaractères globuleux sans guillemets tels que*
.
Bien que cela soit peu probable avec des jetons tels que --include=*.html
(par exemple, vous devez avoir un fichier nommé littéralement quelque chose comme --include=foo.html
pour que quelque chose corresponde), cela vaut la peine de garder à l'esprit en général.
Si l' nullglob
option shell est activée (shopt -s nullglob
) et que le globbing ne correspond à rien , l'argument sera rejeté .
Par conséquent, pour une solution entièrement robuste , utilisez les éléments suivants:
grep -R '--include=*.'{html,php,htm} pattern /some/path
'--include=*.'
est traité comme un littéral , car il est entre guillemets simples ; cela empêche une interprétation par inadvertance de *
comme un caractère globuleux.
{html,php,htm}
, l' expansion d'accolades - par nécessité - sans guillemets [1]
, se développe en 3 arguments, qui, en raison de {...}
suivre directement le'...'
jeton , incluent ce jeton.
Par conséquent, après la suppression des guillemets par le shell, les 3 arguments littéraux suivants sont finalement passés àgrep
:
--include=*.html
--include=*.php
--include=*.htm
[1] Plus précisément, ce ne sont que les parties syntaxiques de l'expansion d'accolades qui doivent être sans guillemets, les éléments de la liste peuvent toujours être entre guillemets individuellement et doivent l'être s'ils contiennent des métacaractères globuleux qui pourraient entraîner un globbing indésirable après l'expansion d'accolades; bien que cela ne soit pas nécessaire dans ce cas, ce qui précède pourrait être écrit comme
'--include=*.'{'html','php','htm'}