Использование {html,php,htm}
может работать только в качестве расширения распорки , которая является нестандартной (не POSIX-совместимой) особенностью bash
, ksh
и zsh
.
Другими словами: не пытайтесь использовать его в сценарии, который нацелен /bin/sh
- в этом случае используйте явные множественные --include
аргументы.
grep
сам не понимает {...}
обозначений.
Чтобы раскрытие фигурных скобок было распознано, это должен быть токен без кавычек (часть a) в командной строке.
Расширение скобки расширяется до нескольких аргументов , поэтому в рассматриваемом случаеgrep
отображается несколько --include=...
параметров, как если бы вы передали их по отдельности.
Результаты расширения скобки: подвергаются подстановке (расширению имени файла) , что имеет подводные камни :
Каждый результирующий аргумент может быть расширен до совпадающих имен файлов, если он содержит не заключенные в кавычки метасимволы подстановки, такие как *
.
Хотя это маловероятно с такими токенами, как --include=*.html
(например, у вас должен быть файл, буквально названный чем-то вроде --include=foo.html
для чего-то сопоставимого), в целом об этом стоит помнить.
Если nullglob
опция оболочки shopt -s nullglob
включена ( ) и подстановка совпадает ничего не соответствует , аргумент будет отброшен .
Следовательно, для полностью надежного решения используйте следующее:
grep -R '--include=*.'{html,php,htm} pattern /some/path
'--include=*.'
рассматривается как буквальный , так в одинарные кавычки ; это предотвращает случайную интерпретацию *
символа подстановки.
{html,php,htm}
, - по необходимости - расширение фигурных скобок без кавычек [1]
, расширяется до 3 аргументов, которые из-за {...}
прямого следования за '...'
токеном , включают в себя , что маркер.
Следовательно, после удаления кавычек оболочкой в конечном итоге передаются следующие 3 буквальных аргументаgrep
:
--include=*.html
--include=*.php
--include=*.htm
[1] Точнее, только релевантные синтаксису части раскрытия фигурных скобок должны быть не заключены в кавычки, элементы списка могут по-прежнему заключаться в индивидуальные кавычки и должны быть, если они содержат метасимволы подстановки, которые могут привести к нежелательному подстановке подстановки после раскрытия фигурных скобок; хотя в данном случае это и не обязательно, приведенное выше можно записать как
'--include=*.'{'html','php','htm'}