Respostas:
O *
(asterisco ou estrela) é 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 iniciais. Consulte o manual do bash sobre 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 literalmente ao comando.
Exemplos explicados. O citado:
grep "string" . -r --include "*.pl"
Aqui grep
receberá a opção --include
com o argumento *.pl
. Essa é a sequência de 4 caracteres com o *
caractere como primeiro caractere. O que grep
faz com essa string é inteiramente de responsabilidade grep
. Nesse caso, --include
significa considerar apenas os arquivos que correspondem ao padrão *.pl
.
Nos bastidores do AFAIK, o gnu grep usa o mesmo padrão que corresponde à lib que o 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 existem os arquivos foo.pl
, bar.pl
e baz.pl
. Após expandir a linha de comando, fica 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 nome do arquivo foo.pl
.
As opções bar.pl
e os baz.pl
meios grep também procurarão nesses arquivos, mas como eles não correspondem ao padrão foo.pl
, serão ignorados.
grep -r
parecia inconsistente, mas nunca percebi que era apenas quando eu usava um *
.
A diferença é que, se você não citar o padrão ( *.pl
), ele é expandido pelo shell. Por exemplo, se você executá-lo grep
em um diretório que contém um arquivo chamado foo.pl
, uma vez que o *pl
é expandido pelo shell, o que grep
realmente vê é:
grep "string" . -r --include foo.pl
Como você diz para incluir apenas, foo.pl
ele pesquisará apenas esse arquivo.
Se você citar seu padrão, o shell não o expandirá e obterá grep
o comando correto, a saber
grep "string" . -r --include *pl
peopl
não será expandido por *.pl
.
grep
; está na concha.grep
nunca vê as aspas.