Potrzebuję użyć powłoki bash "wewnątrz" programu C#. Chcę naśladować typowanie użytkownika w trybie interaktywnym i uruchamianie poleceń cygwin.Używanie bash (cygwin) wewnątrz programu C#
Utworzono proces, który uruchamia bash i przekierowuje stdin, stout i std error, ale mogę; t get tty do pracy załączony jest przykładowy kod, który uruchamia proces bash i przekierowuje wejście/wyjście.
Problem polega na tym, że nie mam urządzenia tty. Gdy próbuję uruchomić polecenie tty lub polecenia stty i odbierać reakcja na błąd
tty - not a tty
stty - Inappropriate ioctl for device
myślę, że jest to spowodowane z psi.UseShellExecute = false;
trzeba uruchomić cygwin i wyłącz echo z stty -echo ale aby to zrobić I potrzebujesz urządzenia tty. jak mogę utworzyć powłokę bash cygwin z urządzeniem tty i przekierować stdin, out i error?
1) czego brakuje?
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);
}
}
}
}
Uruchomiłem twój program i mimo, że widzę błąd "Nieodpowiedni ioctl dla urządzenia", widzę po nim komunikat o błędzie cygwin. Na czym dokładnie polega problem? Usunąłem linię CYGWIN = tty i widzę, że te dane wyjściowe są nieprzetworzone, z wyświetlanymi kodami kontrolnymi. –
@Hemlock - Myślę, że kluczem tutaj, opartym na odpowiedzi Kevina Marka, jest to, że decydujesz, czy użyć echa, czy to naprawdę ma znaczenie, jeśli wyłączysz echo/etc ... I jaka jest motywacja za próbę oszukania CYGWINA do używania TTY? – Peter