Это, вероятно, из-за того, как shell расширяет строку глобуса, хранящуюся в переменной.Независимо от того, какие цитаты вы используете, оболочка не расширяет команду, содержащую строку glob, в результирующие файлы, к которым вы можете применить фильтр.
Оболочка выполнит глобализацию после раскрытия переменной без кавычек, но поскольку расширение скобки выполняется до раскрытия переменной (ссылка Расширения оболочки ), глобус не найдет подходящих файлов и оболочкиоставляет буквенную глобальную строку
Когда вы запускаете
git -C $GIT_ROOT ls-files --full-name --cached {include,src}/**/*.{hpp,cpp,tpp,h,c}
Оболочка расширяет глобальную строку после части --cached
до file1..fileN
в зависимости от того, сколько файлов соответствует вашему определению глобуса,то есть как
git -C $GIT_ROOT ls-files --full-name --cached file1 file2 ... fileN
Но то же самое происходит , а не , когда ваша строка глобуса заключена в кавычки (раскрыта из переменной), она раскрывается как
git -C $GIT_ROOT ls-files --full-name --cached '{include,src}/**/*.{hpp,cpp,tpp,h,c}'
, чтоваша строка глобуса остается нерасширенной.
Рекомендуется использовать массив для расширения результата определения глобуса, чтобы сгенерировать имена файлов и передать расширение массива в кавычках в качестве аргумента.Измените ваш код на следующий.
SRC_PATTERNS=({include,src}/**/*.{hpp,cpp,tpp,h,c})
Теперь в массиве уже хранится список файлов, соответствующих вашему определению глобуса, и нам просто нужно передать его команде, как показано ниже.${arr[@]}
- это расширение массива в кавычках, чтобы гарантировать, что символы мета-оболочки в именах файлов не приводят к разделению имен
git -C "${GIT_ROOT}" ls-files --full-name --cached "${SRC_PATTERNS[@]}"
Всегда используйте кавычки для расширения переменных оболочки (если вы не видите хорошийпричина не, что в большинстве случаев нет) и используйте имена переменных в нижнем регистре без _
в имени файла.