O * (estrela ou asterisco) é um caractere especial que é (geralmente) interpretado pelo shell antes de receber o comando. É (geralmente) expandido para todos os nomes de arquivos, exceto aqueles com pontos principais. Consulte o manual sobre a correspondência de padrões para obter mais informações.
Se colocada entre aspas, a estrela não será interpretada pelo shell e será dada ao comando verbatim.
Exemplos explicados. O citado:
grep "string" . -r --include "*.pl"
Aqui grep receberá a opção --include com o argumento *.pl . Essa é a cadeia de 4 caracteres com o caractere * como primeiro caractere. O que grep faz com essa sequência é de até grep . Nesse caso, --include significa considerar apenas os arquivos que correspondem ao padrão *.pl .
AFAIK nos bastidores gnu grep usa o mesmo padrão que combina lib como gnu bash.
O não citado:
grep "string" . -r --include *.pl
Aqui, o shell primeiro expandirá o padrão *.pl para todos os nomes de arquivos terminados em .pl . Suponha que haja os arquivos foo.pl , bar.pl e baz.pl . Depois de expandir a linha de comando, é assim:
grep "string" . -r --include foo.pl bar.pl baz.pl
Aqui grep receberá a opção --include com o argumento foo.pl , seguido pelas opções bar.pl e baz.pl . --include foo.pl significa considerar apenas os arquivos que correspondem ao padrão foo.pl . Como não há curingas no padrão, o único arquivo correspondente será o arquivo denominado foo.pl .
As opções bar.pl e baz.pl significam que o grep também irá procurar nesses arquivos, mas como eles não correspondem ao padrão foo.pl , eles serão ignorados.