makefile 上的扩展 glob 表达式

Extended glob expression on makefile

考虑在 zsh 中由以下命令创建的文件结构。

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

我想全局匹配 'fff' 的所有子目录中没有 'z' 扩展名的所有文件。所以,

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

在交互式 shell 中发挥作用,假设设置了 extended_glob 选项。但是,当我在这样的 makefile 中使用上面的 cl 时

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

它没有处理任何东西并报告错误:

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

zsh:1: no matches found: fff/**/^*.z(.)

另一方面,将所有具有 'z' 扩展名的文件与 ls fff/**/*.z(.) 进行全局匹配,就像在 makefile 中一样以交互方式工作。所以,我怀疑这与 ^ 属于 zsh 的扩展 glob 语法这一事实有关。相应的选项 extended_glob 在我的 .zshrc 中设置。

为什么 glob 在交互式 shell 中按预期工作,但在 GNU make 作为 makefile 配方的一部分执行时却没有?

make 没有为用于执行配方的非交互式 shell 获取您的 .zshrc 文件,因此 extended_glob 未设置。

最简单的方法就是明确地 运行 zsh,将 extended_glob 选项作为命令行传递 argument.q

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