【问题标题】:C# Piping Linux Command Output in Process进程中的 C# 管道 Linux 命令输出
【发布时间】:2018-08-31 21:40:49
【问题描述】:

我在使用 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 上如何做同样的事情?

【问题讨论】:

  • | 和 &lt; 是外壳功能。您需要在 C# 中实现它们或使用 shell 来实现

标签: c# .net linux pipe


【解决方案1】:

您可以简单地使用 StreamWriter 获取流缓冲区中的输出,然后使用它来写入文件,而不是直接写入文件。如果进程仍然挂起,只需使用 linux 的 timeout 命令终止进程即可。 进行一些更改后,以下 sn-p 可能会有所帮助:

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(); ```

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2010-09-18
      • 1970-01-01
      • 2017-05-08
      • 2012-06-18
      • 2011-06-28
      • 2021-12-10
      • 1970-01-01
      • 2020-12-07
      • 1970-01-01
      相关资源
      最近更新 更多