gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:11:24 25 4
gpt4 key购买 nike

我在从 Linux .net 核心控制台应用程序调用命令时遇到一些问题。

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,它会起作用,但我希望能够在我的代码中使用输出。

最佳答案

当你运行这样的命令时

cat /etc/*-release

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

cat /etc/os-release

因此 cat 程序只获取一个参数 - 没有像 * 这样的任何 glob。

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

或者,也许您可​​以自己进行评估。 Directory.EnumerateFiles 等 API 让您可以做到这一点:

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

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

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

关于linux - 从 .net core Linux 调用 shell 命令的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48894948/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com