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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 14:06:01