如何解决Makefile中执行bash命令时提示command not found的问题
问题根因排查&修复
你遇到的报错本质是RUN_CMD调用的bash环境里找不到flake8命令,按以下步骤逐一排查即可:
第一步:确认条件分支是否正常生效
先在Makefile的flake8目标中添加调试输出,确认变量取值是否符合预期:
flake8: @echo "USE_DOCKER: $(USE_DOCKER), RUN_CMD: $(RUN_CMD)" @echo "<<< Running flake8 >>>" $(RUN_CMD) "flake8 ."
执行make flake8后如果输出的RUN_CMD还是本地的bash -c,说明条件判断没触发,常见原因有2个:
- 你导出的
USE_DOCKER值不是完全匹配的小写true,比如写成了TRUE、1,或者导出时带了多余空格。可以把判断逻辑改成非空即生效,避免严格匹配的问题:# 只要设置了USE_DOCKER环境变量,不管值是什么都走docker模式 ifneq ($(USE_DOCKER),) RUN_CMD = $(DOCKER_CMD) endif - 环境变量没有传递到make进程,执行时可以显式传参确认:
make flake8 USE_DOCKER=true
第二步:修复本地bash模式找不到flake8的问题
如果确认走的是本地bash模式,你直接在终端敲flake8 .能运行,但bash -c "flake8 ."报错,是因为bash -c启动的是非交互式shell,不会加载你交互式终端默认加载的~/.bashrc、~/.zshrc等配置,如果你是用pip install --user安装的flake8,路径在~/.local/bin下,非交互式shell的PATH默认没包含这个路径。修复方法二选一:
- 给bash加登录参数,强制加载用户配置:
BASH_CMD := bash -l -c - 在Makefile开头显式声明PATH:
export PATH := $(HOME)/.local/bin:$(PATH)
第三步:修复Docker模式找不到flake8的问题
如果确认走的是Docker模式,说明你api容器内没有安装flake8,进入容器执行安装命令即可,或者把flake8加到你的Dockerfile构建步骤中。
更优实现方案
# 通用配置,支持自定义容器名 USE_DOCKER ?= DOCKER_CONTAINER ?= api BASH_CMD := bash -l -c DOCKER_CMD := docker exec $(DOCKER_CONTAINER) bash -c # 条件判断逻辑更宽松,避免字符串匹配错误 ifeq ($(USE_DOCKER),) RUN_CMD := $(BASH_CMD) else RUN_CMD := $(DOCKER_CMD) endif # 声明伪目标,避免当前目录有同名文件时不执行命令 .PHONY: flake8 flake8: @echo "<<< Running flake8 >>>" $(RUN_CMD) "flake8 ."
后续加其他命令只需要新增对应的目标就行,不用重复写判断逻辑,调用方式也很灵活:
- 本地执行:
make flake8 - Docker执行:
USE_DOCKER=1 make flake8 - 自定义容器执行:
USE_DOCKER=1 DOCKER_CONTAINER=my_app make flake8
内容的提问来源于stack exchange,提问作者Welison Almeida
相关产品推荐
相关产品推荐

