Mac上通过.NET Core启动进程报错“文件或目录不存在”求助
解决Mac上C#启动gradlew进程报“no such file or directory”的问题
这个坑我之前踩过!明明文件就在那儿,终端能跑,C#里就是找不到,核心原因是Mac上的shell脚本执行逻辑和.NET Process的调用方式不匹配,咱们来一步步解决:
问题根源
gradlew本质是一个Shell脚本(不是原生二进制可执行文件),终端里能正常运行是因为Shell会自动读取脚本开头的#!/bin/bash(shebang),调用对应的解释器来执行它。但你当前的代码里设置了UseShellExecute = false,这时候.NET会直接尝试把gradlew当成可执行二进制文件来启动,系统找不到对应的执行程序,就会抛出“no such file or directory”(这个错误提示确实有点误导,不是文件不存在,是不知道怎么执行它)。
可行解决方案
方案1:通过Bash解释器执行(支持输出重定向)
如果需要保留RedirectStandardOutput和RedirectStandardError的功能(也就是必须UseShellExecute = false),可以直接调用/bin/bash来运行gradlew:
var gradlewFullPath = Path.Combine(gradlewDir, "gradlew"); var processInfo = new ProcessStartInfo("/bin/bash") { WorkingDirectory = gradlewDir, CreateNoWindow = true, UseShellExecute = false, RedirectStandardError = true, RedirectStandardOutput = true, // 用-c参数告诉bash要执行的命令 Arguments = $"-c '{gradlewFullPath} bundleRelease'" }; var process = Process.Start(processInfo);
方案2:启用Shell执行(不需要输出重定向时用)
如果不需要捕获输出,可以把UseShellExecute设为true,让系统通过Shell来处理脚本的执行逻辑,这时候直接用绝对路径的gradlew就行:
var gradlewFullPath = Path.Combine(gradlewDir, "gradlew"); var processInfo = new ProcessStartInfo(gradlewFullPath, "bundleRelease") { WorkingDirectory = gradlewDir, CreateNoWindow = true, UseShellExecute = true }; var process = Process.Start(processInfo);
额外检查点
- 确认
gradlew的执行权限:你说已经设置了,但可以再用chmod +x gradlew确认一遍 - 检查脚本开头的shebang:确保
gradlew第一行是#!/bin/bash或者#!/usr/bin/env bash,避免解释器路径错误
内容的提问来源于stack exchange,提问作者Andrei
相关产品推荐
相关产品推荐

