Linux Docker容器中.NET Core调用命令无法设置输入文件的解决方法
问题原因
你遇到的问题根源是shell输入重定向符号<未被解析。在终端执行命令时,< data/file-list.txt由shell(如bash)处理,它会把data/file-list.txt的内容作为标准输入传递给./darknet;但你的.NET Core Process配置中UseShellExecute = false,此时不会通过shell执行命令,<会被当成普通参数传给darknet,导致它误以为要加载名为<的文件,从而报错。
解决方案
以下两种方法可解决该问题:
方法1:通过Shell执行完整命令
直接调用Linux shell(如bash)来处理命令中的重定向逻辑,避免参数解析错误:
public static string RunCommandViaShell(string fullCommand) { var process = new Process() { StartInfo = new ProcessStartInfo { FileName = "/bin/bash", Arguments = $"-c \"{fullCommand}\"", RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false, CreateNoWindow = true, WorkingDirectory = Directory.GetCurrentDirectory() } }; process.Start(); // 先读取输出再等待退出,避免缓冲区死锁 string output = process.StandardOutput.ReadToEnd(); string error = process.StandardError.ReadToEnd(); process.WaitForExit(); return $"{output}{Environment.NewLine}-------------------------------{Environment.NewLine}{error}"; }
调用示例:
string fullCommand = "./darknet detector test -out result.json < data/file-list.txt"; string output = ProcessRunner.RunCommandViaShell(fullCommand);
注意:如果命令包含引号等特殊字符,需自行转义,避免bash解析错误。
方法2:手动处理标准输入重定向
不依赖shell,自行读取输入文件内容并写入Process的标准输入流,这种方式更可控:
public static string RunCommandWithInputRedirect(string command, string args, string inputFilePath) { var process = new Process() { StartInfo = new ProcessStartInfo { FileName = command, Arguments = args, // 移除`< data/file-list.txt`部分 RedirectStandardOutput = true, RedirectStandardError = true, RedirectStandardInput = true, // 开启标准输入重定向 UseShellExecute = false, CreateNoWindow = true, WorkingDirectory = Directory.GetCurrentDirectory() } }; process.Start(); // 读取输入文件并写入进程标准输入 using (var inputStream = process.StandardInput) using (var fileStream = new StreamReader(inputFilePath)) { inputStream.Write(fileStream.ReadToEnd()); inputStream.Close(); // 关闭输入流,告知darknet输入已结束 } string output = process.StandardOutput.ReadToEnd(); string error = process.StandardError.ReadToEnd(); process.WaitForExit(); return $"{output}{Environment.NewLine}-------------------------------{Environment.NewLine}{error}"; }
调用示例:
string args = "detector test -out result.json"; string output = ProcessRunner.RunCommandWithInputRedirect("./darknet", args, "data/file-list.txt");
注意事项
- 确保
WorkingDirectory设置正确,保证darknet能找到data/file-list.txt及相关模型文件。 - 方法1中若使用
UseShellExecute = true,则无法同时开启RedirectStandardOutput或RedirectStandardError,因此更推荐直接调用bash的方式。 - 方法2适合需要动态生成输入内容的场景,不限于读取静态文件。
内容的提问来源于stack exchange,提问作者Alex Zaitsev
相关产品推荐
相关产品推荐

