Makefile调用aspell检查.md文件时$f变量无法识别如何解决
问题根因
Makefile 中$是默认的Make变量引用标识符,你规则中写的$f会被Make优先解析为Make内部变量f,而非传递给Shell的循环变量。如果你的Makefile中没有预先定义名为f的变量,$f会被展开为空值,最终传递给Shell执行的命令实际为aspell --lang=en check ,自然就会抛出缺少文件名的错误。
你直接在终端执行相同命令可以正常运行,是因为终端中不存在Make的预解析步骤,$f会直接被Shell识别为循环变量。
修复方案
你只需要给Shell变量前的$增加转义,写成$$f即可,转义后Make会把$$解析为单个$原样传递给Shell,不会触发Make的变量解析逻辑。
修正后的规则代码如下:
spellcheck-en: for f in src/docs/en/*.md; do aspell --lang=en check $$f; done
可选优化
如果存在指定目录下无.md文件的场景,你可以额外增加文件存在性判断,避免通配符未匹配到文件时直接把src/docs/en/*.md作为文件名传给aspell,导致不必要的报错:
spellcheck-en: @if ls src/docs/en/*.md 1> /dev/null 2>&1; then \ for f in src/docs/en/*.md; do aspell --lang=en check $$f; done \ else \ echo "No matching markdown files found in src/docs/en/"; \ fi
内容的提问来源于stack exchange,提问作者dazai
相关产品推荐
相关产品推荐

