从.net core Linux调用shell命令的问题

时间:2018-02-20 22:00:36

标签: linux debian .net-core

从Linux .net核心consol应用程序调用命令时遇到一些问题。

Sub Main()
    Dim PI As New ProcessStartInfo

    Using Proc As New Process
        With PI
            .FileName = "cat"
            .Arguments = "/etc/*-release"
            .RedirectStandardOutput = True
            .UseShellExecute = False
            .CreateNoWindow = True
        End With
        Proc.StartInfo = PI
        Proc.Start()
        PI = Nothing
        Console.Write(Proc.StandardOutput.ReadToEnd)
    End Using
End Sub

我收到此错误:

cat: '/etc/*-release': No such file or directory

如果我禁用重定向并设置UseShellExecute = True,它可以工作,但我希望能够在我的代码中使用输出。

2 个答案:

答案 0 :(得分:1)

运行

之类的命令时
cat /etc/*-release

linux shell(可能是bash)评估每个参数,然后使用评估的参数调用程序。简单的单词评估自己,但变量(如$SOME_ARGUMENT)和模式(如*)计算值和文件名。所以shell真正评估上面的内容(假设只有一个文件):

cat /etc/os-release

因此cat程序只获得一个参数 - 没有像*这样的全局。

如果您想在程序中模拟该行为,则需要将UseShellExecute设置为True

或者,也许你可以自己做评估。像Directory.EnumerateFiles这样的API允许您这样做:

 Dim textFiles = Directory.EnumerateFiles("/etc/", "*-release")

然后,您需要遍历此集合并使用确切的文件名作为.Arguments值。

编辑:但是为了更进一步,你为什么要尝试这样做?如果您已完整阅读该文件,请拨打cat。为什么不只是Console.WriteLine()文件本身而不是调用cat

答案 1 :(得分:0)

啊......明白了!

我只需要使用bash -c ""cat ""/etc/*-release""""

    Sub Main()
    Dim PI As New ProcessStartInfo

    Using Proc As New Process
        With PI
            .FileName = "bash"
            .Arguments = "-c ""cat ""/etc/*-release"""""
            .RedirectStandardOutput = True
            .UseShellExecute = False
            .CreateNoWindow = True
        End With
        Proc.StartInfo = PI
        Proc.Start()
        PI = Nothing
        Console.Write(Proc.StandardOutput.ReadToEnd)
    End Using
End Sub