You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

执行Makefile的dir目标时报execvp: device/coo: Permission denied的原因是什么

报错原因

  • 根本原因是对Makefile规则的语法理解有误:Makefile中目标对应的执行脚本(recipe)的每一行内容,都会被当作完整的shell命令提交给系统执行,系统会将行内第一个空格分隔的片段识别为要执行的可执行程序路径,剩余片段作为执行参数。
  • 你定义的_get_directories函数展开后得到的是一串目录路径:device/coo device/google device/sky vendor/sky build/product,直接放在dir目标的执行脚本中后,系统会尝试将第一个路径device/coo当作可执行文件运行。但device/coo是目录,操作系统不允许直接执行目录对象,因此抛出execvp: device/coo: Permission denied错误,返回码127对应「找不到符合要求的可执行命令」的错误场景。
  • 你提到find目标运行正常只是巧合:find目标展开后第一个片段是device/coo/AndroidProducts.mk,如果这个文件刚好有可执行权限、且文件头定义了正确的解释器(shebang),执行时就不会报错,只是实际行为和你想要「打印搜索到的文件路径」的预期不符。

修复方案

如果需求是打印函数返回的路径列表,只需要在执行脚本前加上echo命令即可,修改后的目标如下:

search:
	@echo $(call _search-android-products-files-in-dir,device)

find:
	@echo $(_find-android-products-files)

dir:
	@echo $(_get_directories)

加@前缀是为了避免make先打印执行的命令本身,只输出echo的结果。

内容的提问来源于stack exchange,提问作者Bobby Yang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 13:06:02