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

.NET Core在Unix(Raspbian)启动进程报错:文件不存在怎么办?

问题分析与解决方案

嘿,这个问题我之前也踩过坑!核心问题出在波浪号~的解析逻辑上:

你在代码里用的~/Deploy/PROTOTYPE/Launcher/Launcher路径,~是Unix shell(比如bash)的专属特殊符号,用来指代当前用户的主目录,但.NET的ProcessStartInfo并不会自动解析它——尤其是你设置了UseShellExecute = false,这直接绕开了shell,系统会把~当作路径的普通字符去查找,自然会报"No such file or directory"。

给你两个可行的解决方案:

方案一:手动拼接绝对路径(推荐,适配输出重定向需求)

用.NET自带的API获取当前用户的主目录,然后手动拼接完整路径,彻底避开shell的依赖:

var homeDirectory = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
var launcherFullPath = Path.Combine(homeDirectory, "Deploy", "PROTOTYPE", "Launcher", "Launcher");

new Process() { 
    StartInfo = new ProcessStartInfo(launcherFullPath) { 
        Arguments = "", 
        RedirectStandardOutput = true, 
        UseShellExecute = false, 
        CreateNoWindow = true 
    } 
}.Start();

这个方法既能保留你需要的输出重定向功能,又能确保路径是系统可以直接识别的绝对路径,不会出问题。

方案二:通过shell启动(仅当不需要输出重定向时)

如果你确实想依赖shell解析~,可以把UseShellExecute设为true,但要注意:当UseShellExecute = true时,无法同时使用输出/输入/错误重定向(因为重定向功能仅在直接启动进程时生效)。如果你的场景不需要捕获输出,这个方法也可行:

new Process() { 
    StartInfo = new ProcessStartInfo("~/Deploy/PROTOTYPE/Launcher/Launcher") { 
        Arguments = "", 
        UseShellExecute = true, 
        CreateNoWindow = true 
    } 
}.Start();

或者也可以直接调用bash来执行命令,这样即使UseShellExecute=false也能解析~,但如果要重定向输出,需要在bash命令里额外处理:

new Process() { 
    StartInfo = new ProcessStartInfo("bash") { 
        Arguments = "-c '~/Deploy/PROTOTYPE/Launcher/Launcher'", 
        RedirectStandardOutput = true, 
        UseShellExecute = false, 
        CreateNoWindow = true 
    } 
}.Start();

额外注意事项

  • 确认Launcher文件的可执行权限:虽然你说bash能运行,但还是可以用chmod +x ~/Deploy/PROTOTYPE/Launcher/Launcher命令确保权限配置正确;
  • 检查运行.NET程序的用户:如果是通过服务或者其他用户身份运行,~对应的主目录可能和你登录的用户不一致,这时候一定要用绝对路径来避免路径错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:03:30