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