如何使用 Process.Start 启动管道并重定向命令?

krv*_*rvl 8 c#

我正在使用 System.Diagnostics.Process.Start() 在 Linux 操作系统上远程启动命令。到目前为止,我已经能够启动简单的命令,然后读取输出。
例如,我可以执行该命令echo Hello World并读取Hello World其输出。

这是简化的代码:

public void Execute(string file, string args) {
    Process process = new Process {
        StartInfo = {
            FileName = file,
            Arguments = args,
            RedirectStandardOutput = true,
            RedirectStandardError = true,
            UseShellExecute = false
        }
    };
    process.Start();
}
Run Code Online (Sandbox Code Playgroud)

为了更清楚起见,我使用上面的代码,如下所示Execute("echo", "Hello World");

这是我的问题:只要我执行简单的命令,一切都会顺利进行,但我想使用管道和重定向来启动命令,以便对命令及其输出有更强的控制(不将输出本身处理为文本) )。
那么,是否有解决方法(或者可能是特定的库)来实现此结果?

Dzi*_*nny 11

为了在 Linux 中使用所有 shell 功能(包括管道、重定向等)执行命令,请使用以下代码:

public static Process ExecuteInBash(string command)
{
    var process = new Process
    {
        StartInfo = 
        {
            FileName = "bash",
            ArgumentList = { "-c", "--", command },
            RedirectStandardOutput = true,
            RedirectStandardError = true,
            UseShellExecute = false
        }
    };
    process.Start();
    return process;
}
Run Code Online (Sandbox Code Playgroud)

请注意,此方法是非阻塞的,它启动进程并且不等待它完成。为了阻止你必须调用该process.WaitForExit()方法。另外,最好检查退出代码以了解命令是成功还是失败。例子:


var process = ExecuteInBash("echo Hello");
process.WaitForExit();
var standardOutput = process.StandardOutput.ReadToEnd();
var standardError = process.StandardError.ReadToEnd();
if (process.ExitCode == 0)
{
    // Command succeeded.
}
Run Code Online (Sandbox Code Playgroud)