在C#中运行Linux控制台命令

7

我在C#应用程序中使用以下代码通过Mono运行Linux控制台命令:

ProcessStartInfo procStartInfo = new ProcessStartInfo("/bin/bash", "-c ls");
procStartInfo.RedirectStandardOutput = true;
procStartInfo.UseShellExecute = false;
procStartInfo.CreateNoWindow = true;

System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo = procStartInfo;
proc.Start();

String result = proc.StandardOutput.ReadToEnd();

这个命令按预期工作。但是,如果我输入命令"-c ls -l""-c ls /path",输出仍然会忽略-lpath
在使用多个开关的命令时,应该使用什么语法?

2
你可以尝试使用ProcessStartInfo.Arguments来看看替代方法是否可行?另外,你需要/bin/bash吗?你不能直接运行'ls'吗? - cjb110
@cjb110 不,它不起作用。是的,你必须将/bin/bash设置为文件名,否则它无法自行找到bash可执行文件。 - ravindu1024
也许尝试使用“RedirectStandardInput”并发送命令。我不知道确切的代码,但我知道您可以这样做以向进程发送输入。这是一个示例:http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.redirectstandardinput(v=vs.110).aspx - NewfrontSolutions
1
这个问题有解决方案吗?我也遇到了同样的问题。 - Vaibhav Aggarwal
1个回答

3

您忘记了引用命令。

您在bash提示符下尝试执行以下操作了吗?

bash -c ls -l

我强烈建议阅读Bash手册,以及getopt手册,因为它是Bash用来解析参数的工具。 bash -c lsls -l的行为完全相同。为什么?因为您必须告诉bash,-l-c的完整参数,否则-l会被视为bash的参数。无论是bash -c 'ls -l'还是bash -c "ls -l"都能实现您期望的效果。您需要像这样添加引号:
ProcessStartInfo procStartInfo = new ProcessStartInfo("/bin/bash", "-c 'ls -l'");

2
bash -c 'ls -l' 几乎与 bash -c "ls -l" 相同,但在 C# 字符串中不需要转义。 - user1709408

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