执行make指定目标时Zsh报‘command not found’如何解决?
解决Zsh执行make命令时提前解析变量导致的"command not found"警告
出现该问题的核心原因是:Zsh会优先解析命令行中的$(OUTPUT)这类Shell变量语法,但OUTPUT是定义在Makefile里的变量,并非Shell环境变量,所以Zsh找不到该变量就抛出警告,之后才会执行make命令。
以下是几种解决方法:
方法一:用单引号包裹Makefile变量引用,阻止Shell解析
将命令中的变量引用用单引号括起来,让Zsh不展开该表达式,直接传递给make处理:
make '$(OUTPUT)' make '$(FINAL)'
这样make会自行解析内部的$(OUTPUT)变量,Zsh不会再尝试查找不存在的Shell变量。
方法二:先从Makefile中提取变量值,再传递给make
通过Shell命令读取Makefile中的变量值,赋值给Shell变量后再执行make:
# 提取Makefile中的OUTPUT变量值 OUTPUT=$(make -n -qp | awk '/^OUTPUT=/ {print $2}') # 执行make构建 make $OUTPUT
同理,提取FINAL变量的命令是:
FINAL=$(make -n -qp | awk '/^FINAL=/ {print $2}') make $FINAL
方法三:在Makefile中添加伪目标,简化命令调用
修改Makefile,添加两个伪目标(.PHONY标记),直接通过伪目标名调用构建:
OUTPUT=the-contest.odt FINAL=the-contest.html .PHONY: output final output: $(OUTPUT) final: $(FINAL) $(OUTPUT): the-contest.md pandoc -o the-contest.odt the-contest.md $(FINAL): the-contest.md pandoc -o the-contest.html the-contest.md
之后只需执行更直观的命令:
make output # 构建the-contest.odt make final # 构建the-contest.html
内容的提问来源于stack exchange,提问作者alyms108
相关产品推荐
相关产品推荐

