.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
相关产品推荐
相关产品推荐

