Каково различие между “*.pl” и *.pl в grep? Почему заключение в кавычки изменяет результат?

Если Вы не должны искать назад в файле, Вы могли бы использовать именованный канал:

mkfifo my_special_file
yes | head -n 100 > my_special_file&
cat my_special_file

Конечно, можно использовать любую другую команду, включая сложный сценарий, для генерации данных в канале.

10
08.07.2013, 02:25
2 ответа

* (звезда или звездочка), специальный символ, который (обычно) интерпретируется оболочкой, прежде чем этому дадут команду. Это (обычно) расширяется до всех имен файлов кроме тех, которые имеют продвижение точек. См. руководство удара о сопоставлении с образцом для получения дополнительной информации.

Если помещено в кавычки звезда не будет интерпретироваться оболочкой и дана команде дословно.


Примеры объяснены. Заключенный в кавычки:

grep "string" . -r --include "*.pl"

Здесь grep получит опцию --include с аргументом *.pl. Это - 4 символьных строки с * символ как первый символ. Что grep делает с той строкой, полностью до grep. В этом случае --include средства только рассмотреть файлы, соответствующие шаблону *.pl.

AFAIK негласно гну grep использует тот же lib сопоставления с образцом в качестве удара гну.

Не заключенный в кавычки:

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 они будут проигнорированы.

17
27.01.2020, 20:00
  • 1
    Это - большое наблюдение. Я всегда задавался вопросом почему grep -r казался непоследовательным, но никогда не замечал, что это было только, когда я использовал a *. –  j883376 08.07.2013, 11:38

Различие - это, если Вы не заключаете шаблон в кавычки (*.pl) это расширено оболочкой. Например, если Вы выполняете Ваш grep в каталоге, который содержит названный файл foo.pl, начиная с *pl расширен оболочкой, что grep на самом деле видит:

grep "string" . -r --include foo.pl

Так как Вы говорите этому только включать foo.pl это только перероет тот один файл.

При заключении в кавычки шаблона оболочка не развернет его и grep получает корректную команду, а именно,

 grep "string" . -r --include *pl
6
27.01.2020, 20:00
  • 1
    peopl не будет расширен *.pl. положительная сторона –  unxnut 08.07.2013, 00:35
  • 2
    @unxnut, ответ отредактирован. –  terdon♦ 08.07.2013, 00:59

Теги

Похожие вопросы