如何在.NET 5中使用Process类执行Linux管道链式命令
.NET 5 Process类执行Linux管道命令方案
问题背景
需要通过.NET 5的Process类实现和Linux终端一致的命令链式调用效果,例如执行如下命令查询系统总内存:
cat /proc/meminfo | grep MemTotal
单独执行cat命令并传入/proc/meminfo参数可以正常运行,但无法直接执行带管道符的整串命令。
错误尝试与报错
曾尝试将Process.StartInfo.FileName设置为/bin/bash,直接把cat /proc/meminfo | grep MemTotal作为参数传入,运行失败,报错信息如下:
/usr/bin/cat: /usr/bin/cat: cannot execute binary file
可行解决方案
实现原理
管道符|是shell(如sh、bash)提供的语法特性,不属于单个进程的调用能力,因此需要将整串命令交给shell进程解析执行,通过shell的-c参数传入完整命令串即可。
实现代码
Process process = new Process(); process.StartInfo.FileName = "/bin/sh"; string cmd = "cat /proc/meminfo | grep MemTotal"; process.StartInfo.Arguments = $"-c \"{cmd}\""; process.StartInfo.RedirectStandardOutput = true; process.Start(); process.WaitForExit(); Console.WriteLine(process.StandardOutput.ReadToEnd());
注意事项
- 如果命令中包含引号、特殊字符,需要提前做好转义处理,避免和参数外层的引号冲突
- 若需要捕获命令的错误输出,可额外配置
process.StartInfo.RedirectStandardError = true,运行后读取process.StandardError的内容即可 - 可以根据实际需求替换
/bin/sh为/bin/bash等其他shell路径,使用方式一致
内容的提问来源于stack exchange,提问作者ChillSheep
相关产品推荐
相关产品推荐

