Mac端Android Studio下Gradle执行bash脚本报No such file or directory错误
问题原因
source是zsh/bash等shell的内置命令,并非独立的可执行程序。Gradle的Exec任务默认会在系统PATH路径下查找同名可执行文件,无法识别shell内置命令,因此触发文件不存在的报错。- 额外注意:
Exec任务会启动独立子进程执行命令,如果你执行source的目的是导出环境变量给后续CMake构建使用,直接在子进程执行source的结果不会传递到Gradle主进程和后续构建任务,需要额外处理环境变量的传递逻辑。
解决方法
根据你使用脚本的目的,选择对应方案即可:
方案1:脚本仅需执行前置操作(无需传递环境变量给CMake)
直接修改runBuildScript任务,指定zsh作为执行载体:
task runBuildScript(type: Exec) { workingDir './src/main/cpp/build-tools/bin' // 用zsh执行内置的source命令 commandLine 'zsh', '-c', 'source ./set-env.sh' }
执行前先给脚本加执行权限,避免权限报错:
chmod +x ./src/main/cpp/build-tools/bin/set-env.sh
方案2:需要将脚本导出的环境变量传递给CMake
如果你的set-env.sh会导出供CMake读取的配置变量,需要捕获脚本执行后的环境变量存入Gradle主进程,任务修改为以下写法:
task runBuildScript { doLast { def scriptDir = file('./src/main/cpp/build-tools/bin') // 执行脚本并输出所有环境变量供Gradle捕获 def proc = ['zsh', '-c', 'source ./set-env.sh && env'].execute(null, scriptDir) proc.waitFor() if (proc.exitValue() != 0) { throw new GradleException("set-env.sh执行失败: ${proc.errorStream.text}") } // 解析环境变量并存入系统属性,后续CMake构建可直接读取 proc.inputStream.text.eachLine { line -> def parts = line.split('=', 2) if (parts.size() == 2) { System.setProperty(parts[0], parts[1]) } } } }
可选配置:适配Release构建
如果需要同时在Release构建前执行脚本,补充依赖配置即可:
project.afterEvaluate { tasks.getByName("buildCMakeDebug").dependsOn runBuildScript tasks.getByName("buildCMakeRelease").dependsOn runBuildScript }
内容的提问来源于stack exchange,提问作者odieatla
相关产品推荐
相关产品推荐

