Ответы:
*
(Звезда или звездочка) это специальный символ , который (обычно) интерпретатором , прежде чем он получает команду. Он (обычно) распространяется на все имена файлов, кроме тех, которые имеют начальные точки. Смотрите руководство bash о сопоставлении с образцом для получения дополнительной информации.
Если поместить в кавычки, звезда не будет интерпретироваться оболочкой и будет передана команде дословно.
Примеры объяснил. Цитируемый:
grep "string" . -r --include "*.pl"
Здесь grep
будет получен вариант --include
с аргументом *.pl
. Это строка из 4 символов с *
первым символом. Что делать grep
с этой строкой полностью зависит grep
. В этом случае --include
означает рассматривать только файлы, соответствующие шаблону *.pl
.
За кулисами AFAIK GNU grep использует тот же самый шаблон соответствия lib, что и GNU Bash.
Не указано:
grep "string" . -r --include *.pl
Здесь оболочка сначала расширит шаблон *.pl
до всех имен файлов, оканчивающихся на .pl
. Предположим, есть файлы foo.pl
, bar.pl
и baz.pl
. После расширения командная строка выглядит так:
grep "string" . -r --include foo.pl bar.pl baz.pl
Здесь grep
будет получена опция --include
с аргументом foo.pl
, за которой следуют опции bar.pl
и baz.pl
. --include foo.pl
означает рассматривать только файлы, соответствующие шаблону foo.pl
. Так как в шаблоне нет подстановочных знаков, единственный файл, который соответствует файлу с именем foo.pl
.
Параметры bar.pl
и baz.pl
средства grep также будут искать в этих файлах, но, поскольку они не соответствуют шаблону, foo.pl
они будут игнорироваться.
grep -r
казалось противоречивым, но никогда не замечал, что это было только тогда, когда я использовал *
.
Разница в том, что если вы не заключите в кавычку шаблон ( *.pl
), он будет расширен оболочкой. Например, если вы запускаете ваш grep
каталог, в котором содержится файл с именем foo.pl
, поскольку *pl
он расширяется оболочкой, то, что на grep
самом деле видит:
grep "string" . -r --include foo.pl
Поскольку вы говорите, что он должен быть включен, foo.pl
он будет искать только в этом файле.
Если вы процитируете свой шаблон, оболочка не развернет его и grep
получит правильную команду, а именно
grep "string" . -r --include *pl
peopl
не будет расширен *.pl
.
grep
; это в оболочке.grep
никогда не видит цитаты.