Мне нужно использовать bash shell внутри программы C#. Я хочу подражать пользователю в интерактивном режиме и запускать команды cygwin.Использование bash (cygwin) внутри программы C#
Я создал процесс, который запускает bash и перенаправляет stdin, stout и std-ошибку, но я могу; t получить tty для работы в приложении - это пример кода, который запускает процесс bash и перенаправляет ввод/вывод.
проблема в том, что у меня нет устройства tty. если я пытаюсь запустить команду терминальной или Запущенные команды я получаю ответ: ошибка
tty - not a tty
stty - Inappropriate ioctl for device
я думаю, что это связанно с psi.UseShellExecute = false;
мне нужно запустить Cygwin и отключить эхо с Запущенной -echo но делать этого я требуется устройство tty. как я могу создать оболочку bash cygwin с устройством tty и перенаправить stdin, out и error?
1) что не хватает?
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
namespace shartCygwin
{
class Program
{
private static Queue<string> ResponseQueue = null;
private static ManualResetEvent ResponseEvent = null;
static void Main(string[] args)
{
ResponseQueue = new Queue<string>();
ResponseEvent = new ManualResetEvent(false);
Process bashProcess = new Process();
bashProcess.StartInfo.FileName = "C:\\cygwin\\bin\\bash.exe";
bashProcess.StartInfo.Arguments = "--login -i ";
bashProcess.StartInfo.WorkingDirectory = "C:\\cygwin\\bin";
bashProcess.StartInfo.EnvironmentVariables["CYGWIN"] = "tty";
bashProcess.StartInfo.RedirectStandardError = true;
bashProcess.StartInfo.RedirectStandardInput = true;
bashProcess.StartInfo.RedirectStandardOutput = true;
bashProcess.StartInfo.CreateNoWindow = true;
bashProcess.StartInfo.UseShellExecute = false;
bashProcess.StartInfo.ErrorDialog = false;
bashProcess.Start();
DataReceivedEventHandler errorEventHandler = new DataReceivedEventHandler(ErrorDataReceived);
DataReceivedEventHandler outEventHandler = new DataReceivedEventHandler(OutDataReceived);
bashProcess.OutputDataReceived += outEventHandler;
bashProcess.ErrorDataReceived += errorEventHandler;
bashProcess.BeginErrorReadLine();
bashProcess.BeginOutputReadLine();
while(true)
{
Thread.Sleep(1000);
}
}
static void ErrorDataReceived(object sender, DataReceivedEventArgs dataReceivedEventArgs)
{
try
{
lock (ResponseQueue)
{
Console.WriteLine(dataReceivedEventArgs.Data);
ResponseQueue.Enqueue(dataReceivedEventArgs.Data);
ResponseEvent.Set();
}
}
catch (Exception e)
{
Console.WriteLine(e.Data);
}
}
static void OutDataReceived(object sender, DataReceivedEventArgs dataReceivedEventArgs)
{
try
{
lock (ResponseQueue)
{
Console.WriteLine(dataReceivedEventArgs.Data);
ResponseQueue.Enqueue(dataReceivedEventArgs.Data);
ResponseEvent.Set();
}
}
catch (Exception e)
{
Console.WriteLine(e.Data);
}
}
}
}
Я запустил вашу программу, и хотя я вижу ошибку «Несоответствующий ioctl для устройства», я также вижу подсказку cygwin bash после этого. В чем именно проблема? Я удалил строку CYGWIN = tty, и я вижу, что вывод te сырой, с отображаемыми управляющими кодами. –
@Hemlock - Я думаю, что ключ здесь, основываясь на ответе Кевина Марка, заключается в том, что вы решаете, использовать или не использовать эхо, так что действительно ли имеет значение, если вы отключите эхо/etc ... И какая мотивация есть для попытки обмануть CYGWIN в использовании TTY? – Peter