Использование {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'}