带有'*'字符的Process.StartInfo - 查找linux的发行版

时间:2012-04-23 00:28:07

标签: c# gtk#

我的linux命令中有一个明星字符的问题 - 我需要找出发行版。当我替换这个角色时,例如'fedora'然后这个命令给出了很好的结果。在这种情况下,它写如下:/ bin / cat:/ etc / * - release:目录或文件不存在。

我的代码是:

    Process p = new Process();
    p.StartInfo.UseShellExecute = false;
    p.StartInfo.RedirectStandardOutput = true;
    p.StartInfo.FileName = "cat";
    p.StartInfo.Arguments = "/etc/*-release";
    p.Start();
    string output = p.StandardOutput.ReadToEnd();
    p.WaitForExit();

提前感谢您的回答。 马捷

1 个答案:

答案 0 :(得分:2)

当您从shell运行cat /etc/*-release时, shell 负责将*扩展为匹配文件列表(如果有)。

当您自己直接执行程序时(正如您在此处使用Process接口所做的那样),您需要自己重新创建shell的行为。这实际上是最好的,因为运行cat从全功能编程语言中读取文件有点愚蠢 - 当然这种语言提供了一些容易的逻辑等同于:

list = glob(/etc/*-release)
foreach file in (list):
    fd = open(file, "read");
    contents = read(fd)
    close(fd)
    dosomething_with(contents)

您可以使用任何您喜欢的机制来替换那里的glob()位; a fellow stacker has provided his own glob() mechanism in another answer