C#中如何在进程中管道输出Linux命令

4

我在使用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;

有哪些方法可以让这个工作起来?我看到这篇帖子提供了一个解决方案,但它是在Windows系统上。在Linux上如何实现相同的事情?


“|”和“<”是shell的特性。你需要在C#中实现它们,或者让一个shell来实现它们。 - that other guy
2个回答

1
与其直接写入文件,你可以简单地使用 StreamWriter 来获取流缓冲区的输出,然后使用它来写入文件。如果进程仍然挂起,只需使用 Linux 的超时命令终止进程即可。 做出一些更改后,以下代码片段可能会有所帮助:
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

设置process.StartInfo.RedirectStandardOutput=true会导致程序将标准输出重定向到流process.StartInfo.StandardOutput。当这种情况发生时,程序将挂起直到您从标准输出中读取。

为了获得我认为您正在寻找的行为,您只需要将RedirectStandardOutput=false设置即可。这样,您命令中的管道和重定向将按预期工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接