我在使用Process类在Linux系统上通过管道传递命令时遇到麻烦。
我要执行以下命令:rpm2cpio repo.rpm | cpio -divm
我尝试过
process.StartInfo.FileName = "rpm2cpio;
rocess.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.Arguments = "repo.rpm | cpio - idmv";
但是程序挂起。
类似地,我尝试将rpm2cpio的输出保存到字符串或输出文件中,然后将其作为cpio命令的参数传递,但也会挂起。
process.StartInfo.FileName = "cpio";
rocess.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.Arguments = "-idvm < output.txt";
// or
process.StartInfo.Arguments = "-idvm < " + rp2cpio_output;
我可以通过哪些方式使它正常工作?我看到this贴了一个解决方案,但它在Window的系统上。在Linux上怎么做?
答案 0 :(得分:1)
您可以简单地使用 StreamWriter 来获取流缓冲区中的输出,然后使用它来写入文件,而不是直接写入文件。如果进程仍然挂起,只需使用linux的timeout命令终止进程即可。 进行一些更改后,以下代码段可能会有所帮助:
ProcessStartInfo processStartInfo = new ProcessStartInfo();
processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
processStartInfo.FileName = "/bin/bash";
processStartInfo.WorkingDirectory = "/";
string cmd = "timeout 1 cat > temp.txt";
var escapedArgs = cmd.Replace("\"", "\\\"");
processStartInfo.Arguments = $"-c \"{escapedArgs}\"";
processStartInfo.UseShellExecute = false;
processStartInfo.RedirectStandardInput = true;
processStartInfo.RedirectStandardOutput = true;
processStartInfo.RedirectStandardError = true;
processStartInfo.StandardErrorEncoding = System.Text.Encoding.UTF8;
processStartInfo.StandardInputEncoding = System.Text.Encoding.UTF8;
processStartInfo.StandardOutputEncoding = System.Text.Encoding.UTF8;
processStartInfo.UseShellExecute = false;
process.StartInfo = processStartInfo;
process.Start();
stdIOWriter = process.StandardInput;
stdIOWriter.WriteLine("Hey Fellas");
String error = process.StandardError.ReadToEnd();
String output = process.StandardOutput.ReadToEnd(); ```
答案 1 :(得分:0)
设置process.StartInfo.RedirectStandardOutput=true
将使程序将标准输出重定向到流process.StartInfo.StandardOutput
。发生这种情况时,程序将挂起,直到您从标准输出中读取。
要获得我认为您正在寻找的行为,只需设置RedirectStandardOutput=false
。这样,命令中的管道和重定向将按预期工作。