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(.)'
考虑在 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(.)'