C#在linux中执行终端命令

use*_*392 13 c# linux bash terminal

我希望我的 c# 应用程序(我在树莓派上执行)在启动时运行 bash 脚本......
基本上:脚本位于/etc/init.d并命名为mnw. 我希望每当我的 c# 应用程序启动时,它都应该执行 mnw 脚本的一部分。
如果它是在终端中编写的,它将如下所示:

cd /etc/init.d
./mnw stop
Run Code Online (Sandbox Code Playgroud)

我希望这在开始时发生public static void Main(),我一直在尝试

ProcessStartInfo startInfo = new ProcessStartInfo() { FileName = "/dev/init.d/./mnw", Arguments = "stop", }; 
Process proc = new Process() { StartInfo = startInfo, };
proc.Start();
Run Code Online (Sandbox Code Playgroud)

但它说停止是一个意想不到的论点,有什么想法吗?

fli*_*erg 10

我从未ProcessStartInfo在 Mono / Linux 上使用过,但是您是否尝试过通过 bash 调用?

ProcessStartInfo startInfo = new ProcessStartInfo() { FileName = "/bin/bash", Arguments = "/dev/init.d/mnw stop", }; 
Process proc = new Process() { StartInfo = startInfo, };
proc.Start();
Run Code Online (Sandbox Code Playgroud)

此外,可执行位没有问题mnw


3dG*_*ber 10

虽然使用Process已接受的答案中的类有效,但我想补充一点,有一个名为CliWrap 的库,它使像这样的 CLI 调用变得更加容易:

  • 流畅的 API 来构建调用
  • 异步支持
  • 使用自定义环境变量进行调用
  • 设置工作目录
  • 将 stdout/stderr 传输到字符串中的能力
  • 检索退出代码
  • ETC。

以OP问题为例:

var result = await Cli
                  .Wrap("/dev/init.d/mnw")
                  .WithArguments("stop")
                  .ExecuteBufferedAsync();

// result contains:
// -- result.StandardOutput  (string)
// -- result.StandardError   (string)
// -- result.ExitCode        (int)
// -- result.StartTime       (DateTimeOffset)
// -- result.ExitTime        (DateTimeOffset)
// -- result.RunTime         (TimeSpan)

if (result.ExitCode != 0)
    Console.WriteLine("Command failed")
Run Code Online (Sandbox Code Playgroud)

感谢@Tyrrrz这个库!