Відповіді:
*
(Зірка або зірочка) це спеціальний символ , який (зазвичай) інтерпретатором , перш ніж він отримує команду. Він (зазвичай) розширюється на всі імена файлів, крім тих, що мають провідні точки. Див Баш керівництва про зіставленні з зразком для отримання додаткової інформації.
Якщо розміщуватись у лапках, зірка не буде інтерпретуватися оболонкою і надається команді дослівно.
Приклади пояснено. Цитований:
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
ніколи не бачить цитат.