Réponses:
*
( L' étoile ou l'astérisque) est un caractère spécial qui est (généralement) interprété par le shell avant qu'il ne reçoive la commande. Il est (généralement) étendu à tous les noms de fichiers à l'exception de ceux avec des points de tête. Voir le manuel bash sur la correspondance de modèles pour plus d'informations.
S'il est placé entre guillemets, l'étoile ne sera pas interprétée par le shell et sera donnée à la commande mot pour mot.
Exemples expliqués. Celui cité:
grep "string" . -r --include "*.pl"
Ici grep
recevra l'option --include
avec l'argument *.pl
. Il s'agit de la chaîne de 4 caractères avec le *
caractère comme premier caractère. Ce que grep
fait cette chaîne est entièrement à la hauteur grep
. Dans ce cas, cela --include
signifie de ne considérer que les fichiers correspondant au modèle *.pl
.
AFAIK dans les coulisses gnu grep utilise le même motif correspondant à lib que gnu bash.
Celui non cité:
grep "string" . -r --include *.pl
Ici, le shell étendra d'abord le modèle *.pl
à tous les noms de fichiers se terminant par .pl
. Supposons qu'il y ait les fichiers foo.pl
, bar.pl
et baz.pl
. Après avoir développé la ligne de commande ressemble à ceci:
grep "string" . -r --include foo.pl bar.pl baz.pl
Ici grep
recevra l'option --include
avec l'argument foo.pl
, suivie des options bar.pl
et baz.pl
. --include foo.pl
signifie considérer uniquement les fichiers correspondant au modèle foo.pl
. Puisqu'il n'y a pas de caractères génériques dans le modèle, le seul fichier correspondant qui sera le fichier nommé foo.pl
.
Les options bar.pl
et les baz.pl
moyens de grep rechercheront également dans ces fichiers, mais comme ils ne correspondent pas au modèle, foo.pl
ils seront ignorés.
grep -r
semblait incohérent, mais je n'ai jamais remarqué que c'était seulement lorsque j'utilisais un *
.
La différence est que si vous ne citez pas le motif ( *.pl
), il est développé par le shell. Par exemple, si vous exécutez votre grep
dans un répertoire qui contient un fichier appelé foo.pl
, puisque le *pl
est développé par le shell, ce grep
qui apparaît en réalité est:
grep "string" . -r --include foo.pl
Puisque vous lui dites de l'inclure uniquement, foo.pl
il ne recherchera que dans ce fichier.
Si vous citez votre modèle, le shell ne le développera pas et grep
obtiendra la commande correcte, à savoir
grep "string" . -r --include *pl
peopl
ne sera pas développé par *.pl
.
grep
; c'est dans la coquille.grep
ne voit jamais les citations.