C# выполнить терминальную команду в Linux
Я хочу, чтобы мое приложение на C# (которое я выполняю на Raspberry Pi) запускало скрипт bash при каждом запуске.
в основном: скрипт находится в /etc/init.d
и назван mnw
, Я хочу, чтобы при запуске моего приложения на C# оно выполняло часть сценария mnw.
Если бы это было написано в терминале, это выглядело бы так:
cd /etc/init.d
./mnw stop
Я хочу, чтобы это произошло прямо в начале public static void Main()
Я пытался
ProcessStartInfo startInfo = new ProcessStartInfo() { FileName = "/dev/init.d/./mnw", Arguments = "stop", };
Process proc = new Process() { StartInfo = startInfo, };
proc.Start();
но это говорит, что остановка - неожиданный аргумент, есть идеи?
2 ответа
Я никогда не пользовалась 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();
Также нет проблем с исполняемым битом на mnw
?
При использовании
Process
класс, как в принятом ответе, работает, я хотел бы добавить, что есть библиотека под названием CliWrap , которая значительно упрощает такие вызовы CLI:
- свободный API для создания вызовов
- асинхронная поддержка
- вызов с пользовательскими переменными среды
- установить рабочий каталог
- возможность передавать stdout/stderr в строку
- получить код выхода
- и т.п.
используя вопрос 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")
Спасибо user2205454 за эту библиотеку!