Respuestas:
La *
(estrella o asterisco) es un carácter especial que (generalmente) es interpretado por el shell antes de recibir el comando. Se expande (generalmente) a todos los nombres de archivo, excepto aquellos con puntos iniciales. Consulte el manual de bash sobre coincidencia de patrones para obtener más información.
Si se coloca entre comillas, la estrella no será interpretada por el shell y se le dará al comando textualmente.
Ejemplos explicados. El citado:
grep "string" . -r --include "*.pl"
Aquí grep
recibirá la opción --include
con el argumento *.pl
. Esa es la cadena de 4 caracteres con el *
carácter como primer carácter. Lo que grep
hace con esa cadena depende completamente grep
. En este caso, --include
significa considerar solo los archivos que coinciden con el patrón *.pl
.
AFAIK detrás de escena gnu grep usa el mismo patrón que coincide con lib que gnu bash.
El no citado:
grep "string" . -r --include *.pl
Aquí el shell primero expandirá el patrón *.pl
a todos los nombres de archivo que terminen en .pl
. Supongamos que existen los archivos foo.pl
, bar.pl
y baz.pl
. Después de expandir la línea de comando se ve así:
grep "string" . -r --include foo.pl bar.pl baz.pl
Aquí grep
recibirá la opción --include
con el argumento foo.pl
, seguido de las opciones bar.pl
y baz.pl
. --include foo.pl
significa considerar solo los archivos que coinciden con el patrón foo.pl
. Como no hay comodines en el patrón, la única coincidencia de archivo será el nombre del archivo foo.pl
.
Las opciones bar.pl
y baz.pl
medios grep también buscarán en esos archivos, pero como no coinciden con el patrón foo.pl
, se ignorarán.
grep -r
parecía inconsistente, pero nunca me di cuenta de que era solo cuando usaba a *
.
La diferencia es que si no cita el patrón ( *.pl
), el shell lo expande. Por ejemplo, si ejecuta su grep
en un directorio que contiene un archivo llamado foo.pl
, ya que *pl
el shell lo expande, lo que grep
realmente ve es:
grep "string" . -r --include foo.pl
Como le dice que solo incluya foo.pl
, solo buscará en ese archivo.
Si cita su patrón, el shell no lo expandirá y grep
obtendrá el comando correcto, es decir
grep "string" . -r --include *pl
peopl
no se expandirá por *.pl
.
grep
; Está en el caparazón.grep
Nunca ve las citas.