Расширенное выражение glob в make-файле - PullRequest
1 голос
/ 10 января 2020

Рассмотрим файловую структуру, созданную командами ниже в zsh.

mkdir fff fff/a fff/b
touch fff/{a,a/a,b/a,}.{x,y,z}

Я хочу поместить все файлы во все подкаталоги 'fff', которые не имеют расширения 'z'. Итак,

ls fff/**/^*.z(.)

делает трюк в интерактивной оболочке, предполагая, что установлена ​​опция extended_glob. Однако, когда я использую вышеупомянутый cl в make-файле, подобном этому

SHELL=/bin/zsh
list_not_z :
    ls fff/**/^*.z(.)

, он ничего не делает и сообщает об ошибке:

ls fff / ** / ^ *. z (.)

zsh: 1: совпадений не найдено: fff / ** / ^ *. z (.)

С другой стороны, выполняется глобализация всех файлов, которые расширение 'z' с ls fff/**/*.z(.) работает в интерактивном режиме так же, как и в make-файле. Итак, я подозреваю, что это как-то связано с тем, что ^ относится к расширенному синтаксису glob zsh. Соответствующая опция extended_glob установлена ​​в моем .zshr c.

Почему глобус работает, как ожидается, в интерактивной оболочке, но не выполняется при выполнении GNU как часть рецепта make-файла?

1 Ответ

2 голосов
/ 10 января 2020

make не использует ваш файл .zshrc для неинтерактивной оболочки, которую он использует для выполнения рецепта, поэтому extended_glob не установлен.

Самое простое, что можно сделать, это просто явно запустить zsh, передав опцию extended_glob в качестве аргумента командной строки. q

list_not_z:
        zsh -o extended_glob -c 'ls fff/**/^*.z(.)'
...